小编典典

如何在 Jest 中设置模拟日期?

all

我正在使用 moment.js 在我的 React 组件的帮助文件中执行大部分日期逻辑,但我无法弄清楚如何在 Jest a la
中模拟日期sinon.useFakeTimers()

Jest 文档仅谈论诸如 等的计时器功能setTimeoutsetInterval但无助于设置日期,然后检查我的日期功能是否完成了它们应做的事情。

这是我的一些 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 但它似乎有点不稳定,我想将日期设置为测试的固定时间。

关于如何实现的任何想法?


阅读 72

收藏
2022-06-06

共1个答案

小编典典

从 Jest 26 开始,这可以使用“现代”假计时器来实现,而无需安装任何 3rd 方模块:https
://jestjs.io/blog/2020/05/05/jest-26#new-fake-
timers

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

如果您希望假计时器对 所有 测试都处于活动状态,您可以timers: 'modern'在配置中进行设置:https
://jestjs.io/docs/configuration#timers-
string

编辑:截至 Jest 27 现代假计时器是默认设置,因此您可以将参数放到useFakeTimers.

2022-06-06