2013-03-01 14 views
6

Próbuję wysuszyć kilka testów jaśminowych, wyodrębniając udostępnione przykłady.Jasmine udostępniła specyfikacje problemów dotyczących zakresu z coffeespptem

@sharedExamplesForThing = (thing) -> 
    beforeEach -> 
    @thingy = new thing 

    it "is neat", -> 
    expect(@thingy.neat).toBeTruthy() 


describe "widget with shared behavior", -> 
    sharedExamplesForThing(-> new Widget) 

Działa to ładnie, gdy wszystko jest zdefiniowane w jednym pliku. Problemy, które napotykam, występują, gdy próbuję przenieść udostępnione przykłady do osobnego pliku. I dostać Can't find variable: sharedExamplesForThing ...

Więc w interesie debugowania, próbowałem następujące:

describe "widget with shared behavior", -> 
    it "is acting like a meany", -> 
    console.log sharedExamplesForThing 
    expect(false).toBeTruthy() 
    sharedExamplesForThing(-> new Widget) 

W bloku is acting like a meany dziennik pokazuje sharedExamplesForThing jako [Function] ale wciąż uzyskać Can't find variable poza it. Wydaje mi się, że może to mieć coś wspólnego z kwestią zakresu poza moim obecnym doświadczeniem, ale mogę się w tej sprawie całkowicie mylić. Czego tu mi brakuje?

(za pomocą szyn, jasminerice, strażnik-jaśminu)

Odpowiedz

1

Po przypisaniu zmiennej członka najwyższego poziomu w coffeescript jest ona przypisana jako właściwość obiektu globalnego (window w przeglądarce). Więc to generuje następujące javascript:

window.sharedExamplesForThing = ...; 

Oznacza to, że można odwołać się do niego poza plikiem jako window.sharedExamplesForThing czy tylko sharedExamplesForThing. Więc to, co robisz, powinno działać, zakładając, że udostępniony plik przykładowy został załadowany przed plikiem spec. Myślę, że problem polega na tym, że plik spec jest ładowany jako pierwszy (ponieważ funkcje opisowe są uruchamiane podczas ładowania pliku, a funkcje są uruchamiane po załadowaniu wszystkich plików). Może być konieczne dostosowanie kolejności ładowania, możesz spróbować umieścić udostępnione pliki przykładów w katalogu support, a następnie wymagać tego najpierw.

Zamiast przypisywania zmiennych bezpośrednio do obiektu window może lepiej do utworzenia nazw wyeksportować zmienne współdzielone w (tak, aby nie zaśmiecać globalny Object):

window.MyNamespace = {} 

MyNamespace.sharedExamplesForThing = ... 

Następnie w Twój plik specyfikacji można określić jako MyNamespace.sharedExamplesForThing.

Uważam, że warto przyjrzeć się wygenerowanemu skryptowi JavaScript, aby spróbować zrozumieć, w jaki sposób program CoffeeScript eksportuje zmienne między plikami.

0

Oto blog, który napisałem o tym, jak najlepiej dzielić się przykładami. Mam nadzieję że to pomoże.

http://pivotallabs.com/drying-up-jasmine-specs-with-shared-behavior/

+0

Twój blog post jest wysoce niekompletne. Po pierwsze, brakuje tu 'sharedBehaviorForGameOf ', o którym tutaj mowa, a po drugie, mam plik specyfikacji testu, który jest prawie w 100% twoją repliką, nawet do dokładnej hierarchii i posiada tylko jeden blok' it() 'na 'opisz()' blok, a mimo to moje zmienne "udostępnione" są widoczne tylko dla mojego pierwszego testu i nie można ich porównywać z żadnymi innymi testami poniżej pierwszego. Myślę, że niewielu ludzi takich jak ja z pewnością doceni, jeśli wypełnisz swój artykuł i podasz kilka wskazówek dotyczących wspólnych vars/funkcji. Poza tym świetnie spisałeś się w bibliotece, uwielbiam to. – dimitarvp

+0

Zapomniałem wspomnieć, że próbuję użyć wspólnych vars w blokach 'run()', które pochłaniają wynik prawdziwego (nieokiełznanego) wywołania AJAX. Może to problem z zakresu, ponieważ oczywiście twoje przykłady z wanilii działają całkiem nieźle. – dimitarvp

2

znalazłem kawałek na shared examples from thoughtbot naprawdę przydatne.

I wprowadziły go w coffeescript następująco:

1) W niektórych pliku pomocnika, który jest załadowany przed wszystkimi plikami spec:

window.FooSpec = 
    sharedExamples: {} 

window.itShouldBehaveLike = (-> 
    exampleName  = _.first(arguments) 
    exampleArguments = 
    _.select(_.rest(arguments), ((arg) => return !_.isFunction(arg))) 
    innerBlock  = _.detect(arguments, ((arg) => return _.isFunction(arg))) 
    exampleGroup  = FooSpec.sharedExamples[exampleName] 

    if(exampleGroup) 
    return describe(exampleName, (-> 
     exampleGroup.apply(this, exampleArguments) 
     if(innerBlock) then innerBlock() 
    ) 
    ) 
    else 
    return it("cannot find shared behavior: '" + exampleName + "'", (-> 
     expect(false).toEqual(true) 
    ) 
    ) 
) 

2) dla moich Specyfikacja:

(a) Potrafię zdefiniować wspólne zachowanie:

FooSpec.sharedExamples["had a good day"] = (-> 
    it "finds good code examples", -> 
     expect(this.thoughtbot_spy).toHaveBeenCalled() 
) 

(b) i używać go w dowolnym miejscu w jakiejś specyfikacji jako:

itShouldBehaveLike("had a good day") 

(uwaga: jestem przy założeniu spec zdefiniowała this.thoughtbot_spy odpowiednio przed powyższej linii)