9 月 30 日编辑:
我看到我的答案被接受为正确答案,但是 Bret 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
});
在这里,我们不仅要检查是否触发了事件,还要检查是否在超时期间仅触发了一次 if 事件。
Sinon 还支持calledWith 和calledOn,以检查使用了哪些参数和函数上下文。
请注意,如果您希望事件与触发事件的操作同步触发(两者之间没有异步调用),那么您可以将超时设置为零。 1000 毫秒的超时仅在您执行异步调用时才需要,这需要很长时间才能完成。很可能不是这样。
实际上,当事件保证与导致它的操作同步触发时,您可以将代码简化为
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');
});
否则,Bret Copeland 的技术在“成功”情况下(希望是常见情况)总是更快,因为如果事件被触发,它能够立即调用 done。