使用SinonJS存根(带重新连接)

时间:2016-07-08 18:56:23

标签: javascript node.js testing sinon stub

我有一个功能:

var publish = function(a, b, c) {
    main = a + getWriterName(b,c);
}

和getWriterName是另一个函数:

var getWriterName = function(b,c) {
    return 'Hello World';
}

我想测试“发布”功能,但我不想在测试“发布”时运行“getWriterName”函数。我觉得我存在getWriterName函数,因为我不想每次测试“发布”时运行它,但我该怎么做?我做了类似的事情:

var sandbox = sinon.sandbox.create();
sandbox.stub(getWriterName).returns('done');

但这给了我一个错误

  

TypeError:尝试将undefined属性未定义为函数

如果我在写路径中,我的存根有什么问题?

编辑: 我正在使用重新连接,所以想要使用重新连接的解决方案

3 个答案:

答案 0 :(得分:3)

这就是Sinon如何与Rewire一起使用来存根函数。如果存根函数是私有的,则在这种情况下重新连接特别有用。

it('getWriteName always returns "Hello World"', function() {      
    var stub = sandbox.stub();
    stub.returns('Hello World');
    var unset = log.__set__('getWriterName', stub);

    // your test and expectations here

    unset();
    // it's always good to restore the previous state
});

答案 1 :(得分:2)

这解决了我的问题:

如果我的函数位于名为main.js的文件中,那么首先我将文件重新连接为:

var main = rewire('main');

然后在一个函数中存根任何其他函数,在我的情况下,当我必须存根getWriterName时我会这样做:

main.__set__('getWriterName', function(b, c) {
    return 'Something Else'
}

并且在完成使用之后,最后

main.restore();

答案 2 :(得分:0)

来自sinon docs:“sinon.sandbox.create(config)方法主要是集成功能,作为Sinon.JS的最终用户,您可能不需要它。”

通常使用以下语法创建一个sinon存根:

sinon.stub(obj, 'property, function(){
      //do something
}

假设你文件中的某个地方正在导出这两个函数

//somefile.js
var publish = function(a, b, c) {
    main = a + getWriterName(b,c);
}

var getWriterName = function(b,c) {
    return 'Hello World';
}
exports.getWriterName = getWriterName;
exports.publish  = publish;

在测试中导入它们:

var someFile = require('./somefile.js');

试图找出你想要的方法:

sinon.stub(someFile, 'getWriterName', function(b, c) {
    return 'done'
});

你会发现这也行不通。这是因为除非可以将其作为所需文件的属性访问,否则sinon实际上不能删除已经需要的方法。为了实现这一点,您需要这样做:

// somefile.js

var getWriterName = function(b,c) {
    return 'Hello World';
}
exports.getWriterName = getWriterName;

var publish = function(a, b, c) {
    main = a + exports.getWriterName(b,c);
}
exports.publish  = publish;

现在,只要将包含这些函数的文件导入测试,就可以访问getWriterName进行存根。你可以像上面的例子那样做:

sinon.stub(someFile, 'getWriterName', function(b, c) {
    return 'done'
});

可以通过以下方式撤消它:

someFile.getWriterName.restore();