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

dnc*_*253 13 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();
    });
});
Run Code Online (Sandbox Code Playgroud)

但是,这给了我错误: Expected a spy, but got Function.

环顾四周之后,我看到所有的例子都有spyOnbeforeEach.所以,我把测试改为:

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();
    });
});
Run Code Online (Sandbox Code Playgroud)

这很有效.我是很新,茉莉,所以我可能只是缺少明显的东西,但我只是想知道为什么它必须是在beforeEachspyOn工作.只使用它很容易beforeEach,但我想更好地了解正在发生的事情.谢谢.

And*_*eas 11

这只是因为Jasmine在不同的闭包中运行Specs.的describeit呼叫唯一寄存器,稍后添加到队列,然后执行由茉莉回调.茉莉花总是清理间谍......

但你也可以添加spyOnit回调.