使用两个或多个测试进行日期模拟

IT技术 javascript reactjs mocking jestjs
2021-05-01 06:41:34

我们正在使用 jest 进行嘲讽。我有一个函数会根据文件如下所示的时间向我们致意:

export default function getGreetingMessage() {
  const today = new Date();
  const curHr = today.getHours();

  if (curHr < 12) {
      return 'Good morning';
  } else if (curHr < 18) {
      return 'Good afternoon';
  }
  return 'Good evening';
}

我的测试文件如下所示

import getGreetingMessage from '../messages';

describe('messages', () => {
 function setup(date) {
  const DATE_TO_USE = new Date(date);
  global.Date = jest.fn(() => DATE_TO_USE);
 }
 it('should return good afternoon when time is greater than 12', () => {
  setup('Tue Oct 16 2018 15:49:11');
  expect(getGreetingMessage()).toEqual('Good afternoon');
});

it('should return good morning when time is less than 12', () => {
  setup('Tue Oct 16 2018 10:49:11');
  expect(getGreetingMessage()).toEqual('Good morning');
});

it('should return good evening when time is greater than than 19', () => {
  setup('Tue Oct 16 2018 19:49:11');
  expect(getGreetingMessage()).toEqual('Good evening');
});
});

当我单独运行每个测试时,它工作正常。当我一次运行所有测试时,测试失败。

我尝试重置 jest 功能。但不工作。

还有其他方法可以尝试吗?

提前致谢 :)

1个回答

将模拟分配给全局是一种不好的做法,因为它无法清除:

global.Date = jest.fn(() => DATE_TO_USE);

UnmockedDate在后续setup调用中将不可用

const DATE_TO_USE = new Date(date);

没有必要为实现提供jest.fn,它可以根据测试进行更改。由于它Date是预期对象,因此Date可以使用original来创建实例:

const OriginalDate = Date;

beforeEach(() => {
  jest.spyOn(global, 'Date');
});

it('', () => {
  Date.mockImplementation(() => new OriginalDate('Tue Oct 16 2018 15:49:11'));
  expect(getGreetingMessage()).toEqual('Good afternoon');
});