我有以下情况,首先是被测试的类,名为utils.js:
var exports = module.exports = {};
[...]
var internalHelper = exports.internalHelper = function internalHelper(params) {
[...]
return A.library.promise();
}
[...]
var methodUnderTest = exports.methodUnderTest = function methodUnderTest(params) {
[...]
internalHelper(theParams)
.then(result => {
[...]
});
[...]
}
[...]
相关的测试代码片段如下:
var internalHelperStub = sinon.stub(utils, 'internalHelper');
internalHelperStub.resolves({ any: 'response' });
问题在于实际的方法被调用,而不是存根。
有两个非常相似的问题,但是对答案不满意:
为什么不能这样做?
如果有原因,那么实用程序类的代码的正确结构是什么?
我没有看到我不需拆分代码的原因,我也明白了为什么这应该起作用。
编辑:James回答了这个问题here,我一直保留我的答案,因为它提供了解释和代码段解决方案。留给SO主持人标记为重复,合并或在这种情况下进行的任何操作;)
答案 0 :(得分:0)
我想我想出了一种解决方法。
从本质上讲,Sinan能够对文件/类中的公开的引用进行存根。
这意味着在下面的这种情况下,您将无法对B方法的调用进行存根,因为它是使用内部引用来调用的,该引用不受Sinon存根的影响:
/*********** Code under test: myCode.js ************/
var exports = module.exports = {};
[...]
var B = exports.B = function B() {
}
[...]
var A = exports.A = function A() {
B();
}
/*********** Test code: myCode.test.js ************/
[...]
bStub = sinon.stub(myCode,
bStub.returns...
此️会导致在测试过程中调用真实方法,无论是否有存根...
要使该方法成为存根,只需在上面的代码段中使用 exports 引用来使用该方法:
var A = exports.A = function A() {
exports.B();
}