当前位置: 首页 > 知识库问答 >
问题:

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

袁羽
2023-03-14

我使用moment.js在React组件的辅助文件中执行大部分日期逻辑,但我还没有弄清楚如何在Jest a lasinon.useFakeTimers()中模拟日期。

Jest文档只介绍计时器函数,如setTimeoutsetInterval等,但不帮助设置日期,然后检查my date函数是否完成了它们的任务。

以下是我的一些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.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);
    });
    
  });

});

现在这些测试通过了,因为我使用的是矩,我的函数使用的是矩,但它似乎有点不稳定,我想为测试设置一个固定的时间。

你知道怎样才能做到吗?

共有3个答案

刘兴朝
2023-03-14

jest.spy锁定时间:

let dateNowSpy;

beforeAll(() => {
    // Lock Time
    dateNowSpy = jest.spyOn(Date, 'now').mockImplementation(() => 1487076708000);
});

afterAll(() => {
    // Unlock Time
    dateNowSpy.mockRestore();
});
陈浩
2023-03-14

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

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

如果你想让假定时器在所有测试中都是活动的,你可以在你的配置中设置定时器:'现代':https://jestjs.io/docs/configuration#timers-string

编辑:从Jest 27开始,现代伪计时器是默认值,因此您可以将参数放到useFakeTimers中。

芮建茗
2023-03-14

因为Momjs在内部使用Date,所以您可以覆盖Date.now函数以始终返回相同的时刻。

Date.now = jest.fn(() => 1487076708000) //14.02.2017

Date.now = jest.fn(() => new Date(Date.UTC(2017, 1, 14)).valueOf())
 类似资料:
  • 问题内容: 获得了一组对时区敏感的玩笑测试。我们通常使用npm脚本运行它们: 将TZ设置为utc时,我可以在快照中获得如下所示的值: 没有它,我得到: 有没有一种方法可以在我的jest配置中进行设置,这样我就可以在命令行中运行而不必通过NPM脚本了?配置文档中没有关于此的任何内容。 我尝试将这两个添加到我的jest.config.js中。没有人起作用: 当然,解决这个问题似乎微不足道,但是令我惊讶

  • null 如上所示,它导出了一些命名函数,而且重要的是 使用了 。 开玩笑地说,当我为 编写单元测试时,我希望模拟 函数,因为我不希望 中的错误影响我为 编写的单元测试。我的问题是我不确定最好的方法是: 如有任何帮助/洞察力,我们将不胜感激。

  • 问题内容: 我的测试目标中当前已导入: 并在我的相同测试目标中使用它: 在测试中,我正在做以下模拟尖锐函数的操作: 但我得到: 有没有一种方法可以使用带有Jest的功能模拟所有Sharp模块功能? 问题答案: 您需要像这样模拟它: 首先,您需要返回function而不是对象,因为您需要调用。该函数调用将返回带有键的对象,该键包含另一个函数,依此类推。 要测试每个功能,您需要为每个功能创建一个间谍。

  • 问题内容: 我正在使用ref为组件编写测试。我想模拟ref元素并更改一些属性,但不知道如何做。有什么建议? 问题答案: 根据https://github.com/airbnb/enzyme/issues/1937中的讨论,这就是解决方案 可以使用非箭头函数对类进行猴子修补,其中“ this”关键字将传递到正确的作用域。

  • 我有一个问题,而试图使用Android模拟位置,我的主要目标是设置Android GPS认为我们在一个不同的地方,又名假GPS。 我目前尝试了两种不同的类似解决方案,可在这两个网站上使用: 编程丛林 莫比亚奇 这两个教程都是2012年的,我不知道它们是否过时,或者我很难实现它们。 首先,我要确保我有权限: ACCESS_COARSE_LOCATION ACCESS_FINE_LOCATION AC

  • 问题内容: 我开始认为这是不可能的,但是无论如何我都想问。 我想测试我的一个ES6模块以特定方式调用另一个ES6模块。有了茉莉花,这非常容易- 应用程式码: 和测试代码: 笑话相当于什么?我觉得这是一件很想做的简单的事,但是我一直在努力尝试弄清头发。 我最接近的是将s 替换为s,并将其移入测试/函数中。都不是我想做的事情。 为了获得加分,我希望在其中的功能为默认导出时使整个工作正常进行。但是,我知