1. ホーム
  2. javascript

[解決済み] new Date() のようなコンストラクタをモックする方法

2023-05-10 08:07:18

質問

あるメソッドが new Date に依存して日付オブジェクトを作成し、それを操作するメソッドがあります。 操作が期待通りに動作することをテストしているので、返された日付と期待される日付を比較する必要があります。 これを行うために、私は new Date がテストとテストされているメソッドで同じ値を返すことを確認する必要があります。 どのようにそれを行うことができますか?

コンストラクタ関数の戻り値を実際にモック化する方法はありますか?

日付オブジェクトを提供し、モック化できる関数で必要とされるモジュールを作ることはできました。 しかし、それは私のコードでは不必要な抽象化であるように思えます。

テストされる関数の例...

module.exports = {
  sameTimeTomorrow: function(){
    var dt = new Date();
        dt.setDate(dt + 1);
    return dt;
  }
};

の戻り値をモックするにはどうしたらよいでしょうか? new Date() ?

どのように解決するのですか?

更新 : この回答は jest < version 26 を参照してください。 最近のjestのバージョンについては、この回答 .


new Date()のようなコンストラクタをモックするには jest.spyOn を使ってモックすることができます。

test('mocks a constructor like new Date()', () => {
  console.log('Normal:   ', new Date().getTime())

  const mockDate = new Date(1466424490000)
  const spy = jest
    .spyOn(global, 'Date')
    .mockImplementation(() => mockDate)

  console.log('Mocked:   ', new Date().getTime())
  spy.mockRestore()

  console.log('Restored: ', new Date().getTime())
})

そして、出力は次のようになります。

Normal:    1566424897579
Mocked:    1466424490000
Restored:  1566424897608

参照 GitHubのリファレンスプロジェクト .

注:TypeScriptを使用していて、コンパイルエラーが発生するような場合。 Argument of type '() => Date' is not assignable to parameter of type '() => string'. Type 'Date' is not assignable to type 'string' . この場合、回避策として mockdate ライブラリを使用することです。参照 この質問 をご覧ください。