如果间接调用间谍方法,则不调用Sinon Spy

时间:2014-09-25 14:25:13

标签: javascript sinon

问题

在我们的代码库中,我们遇到了sinon的问题,可以使用下面的代码复制。问题是,似乎是间接的间谍返回力量falseconsole.log明确指出该方法被调用但spy.called仍为false

代码

以下CDN可用于html:

//cdnjs.cloudflare.com/ajax/libs/sinon.js/1.7.3/sinon-min.js
//cdnjs.cloudflare.com/ajax/libs/require.js/2.1.14/require.min.js

main.js

require(['myModule'], function(module) {

    //using sinon
    var methodCallerSpy = sinon.spy(module, 'methodCaller')
    console.log(methodCallerSpy); // methodCaller
    module.methodCaller();
    console.log(methodCallerSpy.called); //true


    var methodSpy = sinon.spy(module, 'method');
    console.log(methodSpy); //method
    module.methodCaller();
    console.log(methodSpy.called); // false
    module.method();
    console.log(methodSpy.called); // true

});

和模块

define(function() {
    const method = () => console.log('method called by methodCaller');

    const methodCaller = () => method();

    return{
        method,
        methodCaller
    }
});

1 个答案:

答案 0 :(得分:8)

问题是myModule有两个名为method()methodCaller()的私有函数,以及它使用相同名称公开的两个方法。

Sinon能够监视暴露的方法,但不能监视内部函数。

当您调用module.method()调用公开方法时,Sinon能够检测到该调用。但是,当您拨打method.methodCaller()时,methodCaller()会直接调用method()私有函数,因此Sinon无法检测到该调用。

如果您将methodCaller()功能更改为:

methodCaller = function(){
    this.method();
}

...然后Sinon应该能够在调用method()时捕获对methodCaller()的“间接”调用。