Sinon:如何在一个相同的文件中存入一个方法?

时间:2018-12-08 09:43:43

标签: node.js unit-testing sinon stub

我有以下情况,首先是被测试的类,名为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主持人标记为重复,合并或在这种情况下进行的任何操作;)

1 个答案:

答案 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();
}