我正在试图监视一个全局函数,例如
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);
差异是什么
答案 0 :(得分:4)
使用var spy = sinon.spy(foo);
并不会像您想象的那样包装函数foo
。它实际上返回一个包含包裹函数的间谍。
使用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>