さまざまな日付フィールドが適切に更新されたことを確認したいのですが、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を使用します。
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();
});
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にあるその他の可能なパラメーター
sinon.useFakeTimers()
は何らかの理由でテストの一部を壊していたので、Date.now()
をスタブ化する必要がありました。
_sinon.stub(Date, 'now').returns(now);
_
その場合、const now = new Date();
の代わりにコードで次のことができます
_const now = new Date(Date.now());
_
または、日付関連のものに moment ライブラリを使用するオプションを検討してください。スタブの作成は簡単です。