2016-05-14 11 views
0

我试图弄清楚当异步发射的事件发射时,如何测试sinon.js?node.js测试是否使用sinon.js发射事件而不使用超时

到目前为止,我在做的是设置一个超时,我知道这个事件会被暴露出来,但这很难看,可能会加起来测试运行的总时间,我不想这样做:

it('check that event was called', function(done) { 
    ... 
    var spy = sinon.spy(); 
    var cbSpy = sinon.spy(); 
    obj.on('event', spy); 
    obj.func(cbSpy); // emits event 'event' asynchronously and calls cbSpy after it was emitted 
    setTimeout(function() { 
     sinon.assert.calledOnce(spy, 'event "event" should be emitted once'); 
     sinon.assert.calledOnce(cbSpy, 'func() callback should be called once'); // won't work since the callback will be called only after the event has been emitted and all event listeners finished 
    }, 1000); 
}); 

回答

0

要采取刺,但不使用Sinon(这里真的没有必要)。

it('check that event was called', function(done) { 
    var callbackCalled = false; 
    var eventCalled = false; 

    var checkIfDone() { 
     if (callbackCalled && eventCalled) { 
     done(); 
     } 
    } 

    var callbackSpy = function() { 
     callbackCalled = true; 
     checkIfDone(); 
    } 

    var eventSpy = function() { 
     // Spy was called. 
     // Add assertions for the arguments that are passed if you want. 
     eventCalled = true; 
     checkIfDone(); 
    }; 

    obj.on('event', eventSpy); 
    // emits event 'event' and invokes callback after it was emitted 
    obj.func(callbackSpy); 
}); 

什么可能是更好的只是一次测试一件事。

it('should emit `event`', function(done) { 
    var callback = function() {} 

    var eventSpy = function() { 
     // Spy was called. 
     // Add assertions for the arguments that are passed if you want. 
     done()   
    }; 

    obj.on('event', eventSpy); 
    // emits event 'event' and invokes callback after it was emitted 
    obj.func(callback); 
}); 

it('should invoke the callback', function(done) { 
    var callback = function() { 
     // Callback was called. 
     // Add assertions for the arguments that are passed if you want. 
     done()   
    } 

    obj.func(callback); 
}); 

无论哪种情况,测试都将在异步过程完成时完成。我将使用第二个示例,因为这意味着您可以一次专注于一件事情,并且测试代码更清晰。

相关问题