在我们的代码库中,我们遇到了sinon的问题,可以使用下面的代码复制。问题是,似乎是间接的间谍返回力量false
,console.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
}
});
答案 0 :(得分:8)
问题是myModule
有两个名为method()
和methodCaller()
的私有函数,以及它使用相同名称公开的两个方法。
Sinon能够监视暴露的方法,但不能监视内部函数。
当您调用module.method()
调用公开方法时,Sinon能够检测到该调用。但是,当您拨打method.methodCaller()
时,methodCaller()
会直接调用method()
私有函数,因此Sinon无法检测到该调用。
如果您将methodCaller()
功能更改为:
methodCaller = function(){
this.method();
}
...然后Sinon应该能够在调用method()
时捕获对methodCaller()
的“间接”调用。