我有一个功能:
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属性未定义为函数
如果我在写路径中,我的存根有什么问题?
编辑: 我正在使用重新连接,所以想要使用重新连接的解决方案
答案 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();