У меня есть «сервисный модуль», который прослушивает периодические пульсы (через socket.io), а затем, если пропущен пульс, публикует событие на шине событий (Backbone.Events).Кроме того, если сердцебиение возобновляется позже, оно публикует событие.
Мой модульный тест выглядит примерно так:
describe('Heartbeat service', function() {
var HeartbeatService;
var heartbeatInterval = 1;
//the server is expected to send heartbeats FASTER actually.
//otherwise we risk false alarms
jasmine.require(['services/HeartbeatService'], function(Service) {
HeartbeatService = Service;
});
/*Since these tests use setInterval, it'd be erroneous to allow
mocks to be overwritten by another test. Thus not using beforeEach()*/
function createMocks(){
var mockEventAggregator = jasmine.createSpyObj('Events',['trigger']);
return {
target : new HeartbeatService(heartbeatInterval, mockEventAggregator),
ea : mockEventAggregator
};
}
it('should raise an event on the FIRST missed beat', function() {
var mocks = createMocks();
mocks.target.start();
setTimeout(function(){
expect(mocks.ea.trigger).toHaveBeenCalled();
}, 2);
});
//..other similar tests
});
Моя неприязнь к этому тесту заключается в том, что если он не пройден, то, скорее всего,что инструмент отчетности будет перечислять сбои при другом тесте - поскольку фактическое утверждение будет происходить вне функции it ().