Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何让sinon存根在第n次调用时调用另一个函数_Node.js_Asynchronous_Mocha.js_Sinon_Sinon Chai - Fatal编程技术网

Node.js 如何让sinon存根在第n次调用时调用另一个函数

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

我想使用sinon存根异步测试事件发射器。 我希望存根在被调用后调用回调

我以为
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
。很好,谢谢。我再次更新了我的答案。看起来很干净,很好。感谢您花时间撰写有关如何捕获回调的文章。