如何监视一个功能

时间:2017-05-20 04:59:04

标签: javascript sinon spy

我正在试图监视一个全局函数,例如

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

差异是什么

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>