2012-02-24 6 views
1

У меня есть «сервисный модуль», который прослушивает периодические биения (поверх socket.io), а затем, если упущено биение, публикуется событие на шине событий (Backbone.Events). Также, если сердечный ритм возобновится позже, он публикует событие.Монитор Heartbeat и блок, проверяющий его в javascript - как?

Мой блок тест выглядит примерно так:

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().

+2

Надеюсь, вы не контролируете реальных пациентов с помощью javascript;) – mpm

ответ

1

Вы можете использовать SinonJSs fake timer, чтобы установить часы на 2 тика вперед вместо использования setTimeout.

+0

Выглядит хорошо, сначала попробую, а затем примите ваш ответ. Приветствия. –