14

我有一个简单的测试套件,it里面有一个功能。我想看看我正在调用的函数中是否调用了某个函数,所以我有这样的东西:

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

这有效。我对茉莉花很陌生,所以我可能只是遗漏了一些明显的东西,但我只想知道为什么它必须在 abeforeEachspyOn才能工作。使用 很容易beforeEach,但我想更好地了解发生了什么。谢谢。

4

1 回答 1

12

这仅仅是因为 Jasmine 在不同的闭包中运行 Specs。describeand调用只注册回调,这些it回调被添加到队列中,然后由 Jasmine 稍后执行。茉莉总是清理间谍......

但是您也可以将 添加spyOnit回调中。

于 2012-11-20T20:53:04.080 回答