web-dev-qa-db-ja.com

sinonを使用して新しいDate()をスタブするにはどうすればよいですか?

さまざまな日付フィールドが適切に更新されたことを確認したいのですが、new Date()がいつ呼び出されたかを予測することをいじりたくありません。 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();
    });
  });
});

関連する場合、これらのテストはノードアプリで実行され、TypeScriptを使用します。

33
MrHen

Isuspectあなたが望む useFakeTimers 関数:

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

これは単純なJSです。動作するTypeScript/JavaScriptの例:

var now = new Date();

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

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

Dateコンストラクターのみをモックする方法を探していたときに、この質問を見つけました。すべてのテストで同じ日付を使用したかったのですが、setTimeoutのモックを避けました。シノンは lolex を内部的に使用しています。鉱山ソリューションは、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();
})

lolex APIにあるその他の可能なパラメーター

1
Anatoli Klamer

sinon.useFakeTimers()は何らかの理由でテストの一部を壊していたので、Date.now()をスタブ化する必要がありました。

_sinon.stub(Date, 'now').returns(now);
_

その場合、const now = new Date();の代わりにコードで次のことができます

_const now = new Date(Date.now());
_

または、日付関連のものに moment ライブラリを使用するオプションを検討してください。スタブの作成は簡単です。

1
realplay