定期的なハートビート (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() 関数の外部で発生するためです。