【问题标题】:Sinon Spy is not called if the spied method is called indirectly如果间接调用了 spied 方法,则不会调用 Sinon Spy
【发布时间】:2014-11-20 08:58:31
【问题描述】:

问题

在我们的代码库中,我们遇到了 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
    }
});

【问题讨论】:

    标签: javascript sinon


    【解决方案1】:

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

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

    当您调用module.method() 时,您调用了公开的方法,因此Sinon 能够检测到该调用。但是,当你调用method.methodCaller()时,methodCaller()直接调用了method()私有函数,所以Sinon检测不到这个调用。

    如果您将 methodCaller() 函数更改为:

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

    ... 那么诗浓应该能够在调用methodCaller() 时捕获对method() 的“间接”调用。

    【讨论】:

    • 有没有解决这个确切问题的方法,我不想调用这样的模块的方法。方法只是为了能够监视它们......
    • 很遗憾没有。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 2019-06-22
    相关资源
    最近更新 更多