Jestで模擬日付を設定するにはどうすればいいですか? 質問する

Jestで模擬日付を設定するにはどうすればいいですか? 質問する

私は React コンポーネントのヘルパー ファイルで日付ロジックのほとんどを実行するために moment.js を使用していますが、Jest のように日付をモックする方法がわかりませんsinon.useFakeTimers()

setTimeoutJest のドキュメントでは、などのタイマー関数についてのみ説明されておりsetInterval、日付を設定して、日付関数が意図したとおりに動作するかどうかを確認する方法については説明されていません。

ここに私の JS ファイルの一部を示します:

var moment = require('moment');

var DateHelper = {
  
  DATE_FORMAT: 'MMMM D',
  API_DATE_FORMAT: 'YYYY-MM-DD',
  
  formatDate: function(date) {
    return date.format(this.DATE_FORMAT);
  },

  isDateToday: function(date) {
    return this.formatDate(date) === this.formatDate(moment());
  }
};


module.exports = DateHelper;

Jest を使用して設定した内容は次のとおりです。

jest.dontMock('../../../dashboard/calendar/date-helper')
    .dontMock('moment');

describe('DateHelper', function() {
  var DateHelper = require('../../../dashboard/calendar/date-helper'),
      moment = require('moment'),
      DATE_FORMAT = 'MMMM D';

  describe('formatDate', function() {

    it('should return the date formatted as DATE_FORMAT', function() {
      var unformattedDate = moment('2014-05-12T00:00:00.000Z'),
          formattedDate = DateHelper.formatDate(unformattedDate);

      expect(formattedDate).toEqual('May 12');
    });

  });

  describe('isDateToday', function() {

    it('should return true if the passed in date is today', function() {
      var today = moment();

      expect(DateHelper.isDateToday(today)).toEqual(true);
    });
    
  });

});

現在、私は moment を使用しており、関数も moment を使用しているため、これらのテストは合格しますが、少し不安定なようで、テストの日付を固定時刻に設定したいと思います。

どうすればそれが実現できるか、何かアイデアはありますか?

ベストアンサー1

Jest 26 では、サードパーティのモジュールをインストールせずに、「最新の」偽のタイマーを使用してこれを実現できます。https://jestjs.io/blog/2020/05/05/jest-26#新しいフェイクタイマー

jest
  .useFakeTimers()
  .setSystemTime(new Date('2020-01-01'));

すべてのテストで偽のタイマーをアクティブにしたい場合は、timers: 'modern'構成で次のように設定します。https://jestjs.io/docs/configuration#timers-string

編集: Jest 27 では、最新のフェイク タイマーがデフォルトになっているため、引数を に省略できますuseFakeTimers

おすすめ記事