Монитор сердцебиения и юнит-тестирование в JavaScript - как? - PullRequest
1 голос
/ 24 февраля 2012

У меня есть «сервисный модуль», который прослушивает периодические пульсы (через 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 ().

1 Ответ

1 голос
/ 27 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...