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

Javascript 为什么我必须在beforeach()中调用spyOn?,javascript,unit-testing,jasmine,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.stuffDon

我有一个简单的测试套件,里面有一个
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();
    });
});
但是,这给了我一个错误:
预期是间谍,但得到了函数。

在查看了一些示例后,我看到所有示例都在每个示例之前的
中有
spyOn
。因此,我将测试改为:

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

这是有效的。我对jasmine很陌生,所以我可能只是缺少了一些明显的东西,但我只是想知道为什么它必须在每次
之前都在一个
中才能让
spyOn
工作。在每次
之前只使用
是很容易的,但我想更好地了解发生了什么。谢谢。

这只是因为Jasmine以不同的方式运行规范。
descripe
it
只调用添加到队列中然后由Jasmine稍后执行的注册回调。茉莉花总是清理间谍

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