我想知道sinon.js是否有可能只将方法存在一次?
例如:
sinon.stub(module, 'randomFunction', 'returnValue/function');
在我的测试中, module.randomFunction 将在同一个测试中多次调用 ,但我只希望存根触发一次,然后将其恢复为函数恢复正常行为。
模拟真实代码:
myModule.putItem(item, function (err, data) {
if (err) {
// do stuff
return callback();
} else {
// do other stuff
return callback(null, data);
}
});
我第一次想要触发错误,其他时候我只是想让它继续真正的流程。
这在sinon有可能吗?
亲切的问候,
麦
编辑:我根据@Grimurd的回答发布了我找到的问题解决方案
答案 0 :(得分:3)
<强>解决方案:强>
sandbox.stub(module, 'putItem')
.onFirstCall().yields('ERROR')
.onSecondCall().yields(null, item)
根据@grimurd的答案,我设法让它与&#39; yield&#39;合作。 Yields触发它在原始方法签名中找到的第一个回调函数。
因此,在第一次通话时,我基本上会说callback('error')
,在第二次通话时,我说callback(null, item)
。
不知怎的,我确实想知道回调是否是一个比收益更好的方法名称;)
感谢您的回答!
答案 1 :(得分:2)
是的,这是可能的。假设您使用mocha作为测试框架。
describe('some tests', function() {
var sandbox;
beforeEach(function() {
sandbox = sinon.sandbox.create();
});
afterEach(function() {
sandbox.restore();
})
it('is a test with a stub', function() {
// This gets restored after each test.
sandbox.stub(module, 'randomFunction', 'returnValue/function');
})
})
查看sinon sandbox api了解详情。
<强>更新强>
要回答您的实际问题,
describe('some tests', function() {
var sandbox;
beforeEach(function() {
sandbox = sinon.sandbox.create();
});
afterEach(function() {
sandbox.restore();
})
it('is a test with a stub', function() {
// This gets restored after each test.
sandbox.stub(module, 'randomFunction')
.onFirstCall().returns('foo')
.onSecondCall().returns('bar')
.onThirdCall().returns('foobar');
})
})
记录http://sinonjs.org/docs/搜索stub.onCall(n)
答案 2 :(得分:2)
其他答案似乎忽略了问题的关键部分:“我只希望存根触发一次然后恢复它,以便函数恢复其正常行为”。
以下代码对给定方法进行一次存根,然后恢复为以前的行为:
let stub = sandbox.stub(module, 'method')
.onFirstCall().returns(1)
.onSecondCall().callsFake((...args) => {
stub.restore();
return module.method(...args);
});
答案 3 :(得分:0)
IMO 是实现预期行为的更简单方法。来自文档:
<块引用>stub.callThrough();
导致在没有条件存根匹配时调用包装在存根中的原始方法。
所以,一个真实的例子是:
let stub = sandbox.stub(module, 'method')
.onSecondCall().returns('whatever');
stub.callThrough();
请注意,原始方法也将在第一次被调用时执行。