1

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

4

1 に答える 1

1

setTimeoutを使用する代わりに、 SinonJSの偽のタイマーを使用して時計を2ティック進めることができます。

于 2012-02-26T20:40:49.910 に答える