我正在使用 moment.js 在我的 React 组件的帮助文件中执行大部分日期逻辑,但我无法弄清楚如何在 Jest a la 中模拟日期sinon.useFakeTimers()。
sinon.useFakeTimers()
Jest 文档仅谈论诸如 等的计时器功能setTimeout,setInterval但无助于设置日期,然后检查我的日期功能是否完成了它们应做的事情。
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 开始,这可以使用“现代”假计时器来实现,而无需安装任何 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
timers: 'modern'
编辑:截至 Jest 27 现代假计时器是默认设置,因此您可以将参数放到useFakeTimers.
useFakeTimers