2012-11-20 13 views
13

私はそれの中に1つのit機能を持つ単純なテストスイートを持っています。私は特定の関数は、私が呼んでいる関数内で呼び出されたかどうかを確認したいので、私はこのようなものがあります:beforeEach()でspyOnを呼び出す必要があるのはなぜですか?

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(); 
    }); 
}); 

しかし、これは私にエラー与える:いくつか見回した後Expected a spy, but got Function.

を、私はすべての例がbeforeEachspyOnを持っているのを見ました。そこで、私はテストを次のように変更しました:

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(); 
    }); 
}); 

これは機能します。私はジャスミンには新しかったので、明らかに何かが欠落しているかもしれませんが、spyOnが動作するためにはなぜそれがbeforeEachになければならないのかを知りたいだけです。 beforeEachを使用するだけでも簡単ですが、何が起こっているのかをよく理解したいと思います。ありがとう。

答えて

10

これは、Jasmineが仕様を異なるクロージャで実行しているためです。 describeitは、キューに追加された後、Jasmineによって後で実行される登録コールバックのみを呼び出します。そして、ジャスミンはいつもスパイをきれいにする。

itコールバックに追加することもできます。

関連する問題