【问题标题】:how to spy on a function如何监视函数
【发布时间】:2017-10-20 07:04:01
【问题描述】:

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

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

有什么区别

【问题讨论】:

  • 我已经留下了答案,如果您有什么需要我澄清的,请告诉我。如果问题已解决,请标记为答案。

标签: javascript sinon spy


【解决方案1】:

使用var spy = sinon.spy(foo); 不会像您想象的那样包装函数foo。它实际上返回一个包含 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>

【讨论】:

  • 感谢您的回答。顺便说一句,为什么不window.foo 以及为什么window, "foo"
  • spy 函数需要知道要监视的对象和该对象的方法。正如我在回答中所说,在内部它正在执行类似object[method] = wrapped(object[method]) 的操作。在 javascript 中,从技术上讲,您不能覆盖函数,而是重定向函数的引用。 foo 引用的函数永远不会改变,但变量foo 引用的函数会改变,即通过使用对象和对象的方法。
  • 非常感谢您的精彩解释..这对我来说很重要:)
猜你喜欢
  • 2015-12-29
  • 2017-06-15
  • 2013-07-21
  • 2019-01-12
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多