Node.js 如何让sinon存根在第n次调用时调用另一个函数
我想使用sinon存根异步测试事件发射器。 我希望存根在被调用后调用回调 我以为Node.js 如何让sinon存根在第n次调用时调用另一个函数,node.js,asynchronous,mocha.js,sinon,sinon-chai,Node.js,Asynchronous,Mocha.js,Sinon,Sinon Chai,我想使用sinon存根异步测试事件发射器。 我希望存根在被调用后调用回调 我以为stub.yields是我想要的,但不是。有没有一个简洁的方法可以做到这一点 it('asynchronously emits finish after logging is complete', function(done){ const EE = require('events'); const testEmitter = new EE(); var cb
stub.yields
是我想要的,但不是。有没有一个简洁的方法可以做到这一点
it('asynchronously emits finish after logging is complete', function(done){
const EE = require('events');
const testEmitter = new EE();
var cb = sinon.stub();
cb.calls(completed); // no such method but this is what I need
testEmitter.on('finish', cb.bind(null));
testEmitter.emit('finish');
function completed() {
expect(cb).to.have.been.calledOnce;
expect(cb).to.have.been.calledOn(null);
expect(cb).to.have.exactArgs();
done()
}
});
目前,我正在做这样的事情
it('asynchronously emits finish', function(done) {
const EE = require('events');
const testEmitter = new EE();
var count = 1;
process.nextTick(() => testEmitter.emit('finish'));
function cb(e) {
var self = this;
expect(e).to.be.an('undefined');
expect(self).to.equal(testEmitter);
if(!count--)
done()
}
testEmitter.on('finish', cb);
process.nextTick(() => testEmitter.emit('finish'));
});
它工作得很好,但是,我需要推广它,我认为我可以用sinon更有效地完成它。但我无法从sinon的文档中找到如何做到这一点。我错过什么了吗
多亏了罗伯特·克莱普,以下是解决方案
it('asynchronously emits finish after logging is complete', function(done){
const EE = require('events');
const testEmitter = new EE();
var cb = sinon.spy(completed);
process.nextTick(() => testEmitter.emit('finish'));
testEmitter.on('finish', cb.bind(null));
process.nextTick(() => testEmitter.emit('finish'));
function completed() {
if(cb.callCount < 2)
return;
expect(cb).to.have.been.calledTwice;
expect(cb).to.have.been.calledOn(null);
expect(cb).to.have.been.calledWithExactly();
done()
}
});
it('日志记录完成后异步发出finish',函数(完成){
const EE=要求(“事件”);
const testEmitter=新EE();
var cb=sinon.spy(已完成);
process.nextTick(()=>testEmitter.emit('finish');
testEmitter.on('finish',cb.bind(null));
process.nextTick(()=>testEmitter.emit('finish');
函数已完成(){
如果(cb.callCount<2)
返回;
expect(cb).to.have.been.calledTwice;
expect(cb).to.have.been.calledOn(null);
expect(cb.to.have.been.calledWithJustice();
完成()
}
});
您可以使用间谍,因为间谍会调用他们正在监视的功能:
var cb = sinon.spy(completed);
但是,如果由于某种原因事件处理程序从未被调用,测试将因超时而失败。您可以使用spy,因为Spie将调用他们正在监视的函数:
var cb = sinon.spy(completed);
但是,如果由于某种原因事件处理程序从未被调用,测试将因超时而失败。太好了,谢谢!我将更新我的问题。如何让它在第二次呼叫时回电?@CoolBlue你不能用间谍做这件事,只有存根(但是存根,你不能轻易地呼叫
completed
,所以这有点像第22条军规),尽管你可以在completed
内检查cb.callCount
。很好,谢谢。我再次更新了我的答案。看起来很干净,很好。感谢您花时间撰写有关如何捕获回调的文章。太好了,谢谢!我将更新我的问题。如何让它在第二次呼叫时回电?@CoolBlue你不能用间谍做这件事,只有存根(但是存根,你不能轻易地呼叫completed
,所以这有点像第22条军规),尽管你可以在completed
内检查cb.callCount
。很好,谢谢。我再次更新了我的答案。看起来很干净,很好。感谢您花时间撰写有关如何捕获回调的文章。