web-dev-qa-db-fra.com

Comment puis-je stub new Date () en utilisant sinon?

Je veux vérifier que divers champs de date ont été mis à jour correctement, mais je ne veux pas perdre mon temps à prédire quand new Date() a été appelé. Comment puis-je stub le constructeur Date?

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();
    });
  });
});

Si cela est pertinent, ces tests s'exécutent dans une application de nœud et nous utilisons TypeScript.

27
MrHen

Je suspecte vous voulez la useFakeTimers fonction:

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

Ceci est simple JS. Un exemple de travail TypeScript/JavaScript:

var now = new Date();

beforeEach(() => {
    sandbox = sinon.sandbox.create();
    clock = sinon.useFakeTimers(now.getTime());
});

afterEach(() => {
    sandbox.restore();
    clock.restore();
});
52
Alex Booker

J'ai trouvé cette question lorsque je cherchais une solution: comment se moquer de Date constructeur SEULEMENT . Je voulais utiliser la même date pour chaque test, mais pour éviter de se moquer de setTimeout. Sinon utilise lolex en interne La solution de mine est de fournir un objet comme paramètre pour sinon:

let clock;

before(async function () {
    clock = sinon.useFakeTimers({
        now: new Date(2019, 1, 1, 0, 0),
        shouldAdvanceTime: true,
        advanceTimeDelta: 20
    });
})

after(function () {
    clock.restore();
})

Autres paramètres possibles que vous pouvez trouver dans lolex API

1
zxxc

sinon.useFakeTimers() était en train de casser certains de mes tests pour une raison quelconque, je devais me moquer de Date.now()

sinon.stub(Date, 'now').returns(now);

Dans ce cas, dans le code au lieu de const now = new Date(); vous pouvez faire

const now = new Date(Date.now());

Ou considérez l'option d'utiliser moment library pour les éléments liés à la date. Stubbing moment est facile.

1
realplay