Edit 30 сентября:
Я вижу, что мой ответ принимается как правильный ответ, но техника Брета Коупленда (см ответ ниже) просто лучше, потому что это быстрее, если проверка прошла успешно, который будет иметь место чаще всего вы запускаете тест как часть набора тестов.
Техника Брет Коупленд правильная. Вы также можете сделать это немного по-другому:
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 мс необходим только тогда, когда вы выполняете асинхронные вызовы, между которыми требуется много времени. Скорее всего, не так.
На самом деле, когда событие гарантированно срабатывает синхронно с операцией, вызвавшей его, можно упростить код
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');
});
В противном случае метод Брета Коупленда всегда быстрее в «успех» дела (надеюсь общий случай), так как он может немедленно позвонить done
, если событие инициировано.
Как код «сбой тестового набора»? Я ожидаю, что этот конкретный тест будет просто тайм-аут. Возможно, в других частях тестового кода есть проблемы. –