編輯9月30日:
我看到我的回答被接受爲正確的答案,但佈雷特Copeland的技術(見下面的回答)僅僅是更好,因爲它是在測試是成功的更快,這會是這樣大多數情況下,您會將測試作爲測試套件的一部分進行測試
Bret Copeland的技術是正確的。你也可以做到這一點有點不同:
it('should emit an some_event', function(done){
var eventFired = false
setTimeout(function() {
assert(eventFired, 'Event did not fire in 1000 ms.');
done();
}, 1000); //timeout with an error in one second
myObj.on('some_event',function(){
eventFired = true
});
// do something that should trigger the event
});
這可以縮短一點與Sinon.js幫助。
it('should emit an some_event', function(done){
var eventSpy = sinon.spy()
setTimeout(function() {
assert(eventSpy.called, 'Event did not fire in 1000ms.');
assert(eventSpy.calledOnce, 'Event fired more than once');
done();
}, 1000); //timeout with an error in one second
myObj.on('some_event',eventSpy);
// do something that should trigger the event
});
這裏我們檢查的不僅是事件觸發,而且事件在超時期間只觸發一次。
Sinon還支持calledWith
和calledOn
,以檢查使用了哪些參數和函數上下文。
請注意,如果您希望事件與觸發事件的操作(兩者之間無異步調用)同步觸發,則可以使用超時爲零的操作。只有在完成需要很長時間的異步調用時,才需要超時1000 ms。最有可能不是這種情況。
實際上,當事件被保證能與導致它的操作同步閃光,您可以將代碼簡化爲
it('should emit an some_event', function() {
eventSpy = sinon.spy()
myObj.on('some_event',eventSpy);
// do something that should trigger the event
assert(eventSpy.called, 'Event did not fire.');
assert(eventSpy.calledOnce, 'Event fired more than once');
});
否則,佈雷特Copeland的技術總是快於「成功」的情況下(有希望常見的情況),因爲如果事件被觸發,它能夠立即呼叫done
。
代碼是如何「崩潰測試套件」?我希望這個特定的測試將會超時。也許在測試代碼的其他部分有問題。 –