1. ホーム
  2. ジャバスクリプト

[解決済み】Jestでモックデートを設定するにはどうすればいいですか?

2022-04-10 05:46:02

質問

私はmoment.jsを使用して、Reactコンポーネント用のヘルパーファイルで日付ロジックの大部分を実行していますが、Jestで以下のように日付をモックする方法を見つけることができずにいます。 sinon.useFakeTimers() .

Jestのドキュメントでは、以下のようなタイマー関数についてのみ説明されています。 setTimeout , 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を使用しているため、パスしますが、それは少し不安定なようで、私はテストのために日付を固定時間に設定したいと思います。

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

解決方法は?

Jest 26では、サードパーティモジュールをインストールしなくても、quot;modern" フェイクタイマーを使って実現することができます。 https://jestjs.io/blog/2020/05/05/jest-26#new-fake-timers

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

偽のタイマーを有効にする場合 すべて テストでは timers: 'modern' を設定します。 https://jestjs.io/docs/configuration#timers-string

EDIT: Jest 27時点では、モダンなフェイクタイマーがデフォルトなので、引数を削除して useFakeTimers .