2012-11-20 9 views
13

Mam prosty zestaw testów, który ma jedną funkcję it w środku. Chcę zobaczyć, czy dana funkcja jest wywoływana wewnątrz funkcji Dzwonię, więc mam coś takiego:Dlaczego muszę wywoływać spyOn w beforeEach()?

describe("doStuff", function() { 
    var foo = new Foo(); 
    spyOn(foo, "doOtherStuff"); 
    foo.doStuff(true); 
    it("should do stuff and other stuff", function() { 
     expect(foo.stuffDone).toBe(true); 
     expect(foo.doOtherStuff).toHaveBeenCalled(); 
    }); 
}); 

Jednak to daje mi błąd: Expected a spy, but got Function.

Po rozglądając niektórych, Widziałem wszystkie przykłady miały spyOn w beforeEach. Zmieniłem test na:

describe("doStuff", function() { 
    var foo = new Foo(); 
    beforeEach(function() { 
     spyOn(foo, "doOtherStuff"); 
     foo.doStuff(true); 
    }); 
    it("should do stuff and other stuff", function() { 
     expect(foo.stuffDone).toBe(true); 
     expect(foo.doOtherStuff).toHaveBeenCalled(); 
    }); 
}); 

To działa. Jestem całkiem nowym jaśminem, więc może po prostu brakuje mi czegoś oczywistego, ale chcę tylko wiedzieć, dlaczego musi to być beforeEach, aby zadziałało spyOn. Łatwo jest po prostu użyć beforeEach, ale chcę lepiej zrozumieć, co się dzieje. Dzięki.

Odpowiedz

10

To dlatego, że Jasmine uruchamia specyfikacje w innym zamknięciu. describe i it wywołuje tylko wywołania zwrotne rejestru, które są dodawane do kolejki, a następnie wykonywane przez Jasmine później. I Jasmine zawsze czyści szpiegów ...

Ale można również dodać spyOn do wywołania zwrotnego it.

Powiązane problemy