如何监视函数

how to spy on a function

我正在尝试监视全局函数,例如

function foo() {

}

但是下面的测试失败了,怎么办

    var spy = sinon.spy(foo);
    foo();
    expect(spy.callCount).to.equal(1);

** 编辑 **

如果我像下面那样做就可以了

    var spy = sinon.spy(window, "foo");
    foo();
    expect(spy.callCount).to.equal(1);

所以有什么区别

使用 var spy = sinon.spy(foo); 并没有像您想象的那样包装函数 foo。它实际上 returns 一个包含 wrapped 函数的间谍。

使用var spy = sinon.spy(window, "foo");实际上包装了foo方法。在内部,window["foo"] = <wrapped function> 正在完成,因此将 foo 引用的函数替换为包装函数。

要使 var spy = sinon.spy(foo); 正常工作,您不能调用 foo(),而是需要调用 spy()

function foo() {

}

console.log('BEGIN sinon.spy(foo)');
var spy = sinon.spy(foo);
spy();
foo(); // called foo, but no effect on callCount
foo(); // called foo, but no effect on callCount
foo(); // called foo, but no effect on callCount
console.log('Call Count:', spy.callCount);

console.log('BEGIN sinon.spy(window, \'foo\')');
var spy = sinon.spy(window, 'foo');
spy();
foo(); 
foo(); 
foo();
console.log('Call Count:', spy.callCount);
<script src="https://cdnjs.cloudflare.com/ajax/libs/sinon.js/1.15.4/sinon.min.js"></script>