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

Sinon Spy is not called if the spied method is called indirectly

本文关键字:调用 Sinon Spy 方法 spied 如果      更新时间:2023-09-26

问题

在我们的代码库中,我们有一个关于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
    }
});

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

Sinon有能力监视暴露的方法,但没有内部功能。

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

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

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

则Sinon在调用CCD_ 14时应该能够捕获对CCD_。