心跳监视器和javascript中的单元测试-如何?

心跳监视器和javascript中的单元测试-如何?,javascript,unit-testing,bdd,jasmine,heartbeat,Javascript,Unit Testing,Bdd,Jasmine,Heartbeat,我有一个“服务模块”,它监听周期性的心跳(通过socket.io),然后如果心跳丢失,则在事件总线(Backbone.Events)上发布事件。此外,如果心跳稍后恢复,它会发布一个事件 我的单元测试如下所示: describe('Heartbeat service', function() { var HeartbeatService; var heartbeatInterval = 1; //the server is expected to send heartbeats FAS

我有一个“服务模块”,它监听周期性的心跳(通过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()之外函数。

您可以使用设置时钟2点向前,而不是使用设置超时。

您可以使用设置时钟2点向前,而不是使用设置超时。

我希望您不是通过javascript监控真正的患者;)我希望您不是通过javascript监控真正的患者;)看起来不错,我会先试试,然后很快接受你的答案。干杯。看起来不错,我会先试试,然后很快接受你的答案。干杯