it-swarm.com.de

Wie stuble ich mit Sinon neues Date ()?

Ich möchte überprüfen, ob verschiedene Datumsfelder ordnungsgemäß aktualisiert wurden, aber ich möchte nicht mit der Vorhersage umgehen, wann new Date() aufgerufen wurde. Wie stelle ich den Date-Konstruktor aus?

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

Wenn dies relevant ist, werden diese Tests in einer Knoten-App ausgeführt, und wir verwenden TypeScript.

27
MrHen

Ich vermute, dass Sie die useFakeTimers -Funktion wollen:

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

Das ist einfach JS. Ein funktionierendes TypeScript/JavaScript-Beispiel:

var now = new Date();

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

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

Ich habe diese Frage gefunden, als ich nach einer Lösung suchte, wie man Date Konstruktor NUR .. ___ versuchte. Ich wollte bei jedem Test dasselbe Datum verwenden, aber um Spott setTimeout..__ zu vermeiden. Sinon verwendet intern lolex Meine Lösung ist, Objekt als Parameter für Sinon bereitzustellen:

let clock;

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

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

Weitere mögliche Parameter finden Sie in der lolex API

1
zxxc

sinon.useFakeTimers() brach einige meiner Tests aus irgendeinem Grund, ich musste Date.now() stubben

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

In diesem Fall können Sie dies im Code anstelle von const now = new Date(); tun

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

Oder erwägen Sie die Option moment library für datumsbezogene Inhalte. Einschaltmoment ist einfach.

1
realplay