TimerSpec.js

describe("Timer", function() {
  it("reports the time elapsed", function() {
    var fakeNow = jasmine.createSpy('fake Date.now'),
        timer = new j$.Timer({now: fakeNow});

    fakeNow.and.returnValue(100);
    timer.start();

    fakeNow.and.returnValue(200);

    expect(timer.elapsed()).toEqual(100);
  });

  describe("when date is stubbed, perhaps by other testing helpers", function() {
    var origDate = Date;
    beforeEach(function() {
      Date = jasmine.createSpy('date spy');
    });

    afterEach(function() {
      Date = origDate;
    });

    it("does not throw even though Date was taken away", function() {
      var timer = new j$.Timer();

      expect(timer.start).not.toThrow();
      expect(timer.elapsed()).toEqual(jasmine.any(Number));
    });
  });
});