Search code examples
javascripttestingsinonstub

How do I stub new Date() using sinon?


I want to verify that various date fields were updated properly but I don't want to mess around with predicting when new Date() was called. How do I stub out the Date constructor?

import sinon = require('sinon');
import should = require('should');

describe('tests', () => {
  var sandbox;
  var now = new Date();

  beforeEach(() => {
    sandbox = sinon.sandbox.create();
  });

  afterEach(() => {
    sandbox.restore();
  });

  var now = new Date();

  it('sets create_date', done => {
    sandbox.stub(Date).returns(now); // does not work

    Widget.create((err, widget) => {
      should.not.exist(err);
      should.exist(widget);
      widget.create_date.should.eql(now);

      done();
    });
  });
});

In case it is relevant, these tests are running in a node app and we use TypeScript.


Solution

  • I suspect you want the useFakeTimers function:

    var now = new Date();
    var clock = sinon.useFakeTimers(now.getTime());
    //assertions
    clock.restore();
    

    This is plain JS. A working TypeScript/JavaScript example:

    var now = new Date();
    
    beforeEach(() => {
        sandbox = sinon.sandbox.create();
        clock = sinon.useFakeTimers(now.getTime());
    });
    
    afterEach(() => {
        sandbox.restore();
        clock.restore();
    });