为什么我必须在beforeEach()中调用spyOn?

时间:2012-11-20 19:00:31

标签: javascript unit-testing jasmine

我有一个简单的测试套件,里面有一个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();
    });
});

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

1 个答案:

答案 0 :(得分:11)

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

但您也可以将spyOn添加到it回调。