14

it内部に1 つの機能を持つ単純なテスト スイートがあります。呼び出している関数内で特定の関数が呼び出されているかどうかを確認したいので、次のようなものがあります。

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.

いくつか見回した後、すべての例spyOnに a が含まれていることがわかりましたbeforeEach。そこで、テストを次のように変更しました。

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

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

4

1 に答える 1

12

これは、Jasmine が別のクロージャで Specs を実行するためです。describeとのit呼び出しは、キューに追加され、後で Jasmine によって実行されるコールバックのみを登録します。そして、ジャスミンはいつもスパイを片付けます...

spyOnただし、コールバックに を追加することもできitます。

于 2012-11-20T20:53:04.080 に答える