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

Javascript 使用两个或多个测试进行日期模拟,javascript,reactjs,mocking,jestjs,Javascript,Reactjs,Mocking,Jestjs,我们用笑话来嘲弄。 我有一个功能,将根据时间欢迎我们 该文件如下所示: export default function getGreetingMessage() { const today = new Date(); const curHr = today.getHours(); if (curHr < 12) { return 'Good morning'; } else if (curHr < 18) { return 'Good aft

我们用笑话来嘲弄。 我有一个功能,将根据时间欢迎我们 该文件如下所示:

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';
}
当我单独运行每个测试时,它运行良好。当我一次运行所有测试时,测试都失败了

我尝试重置jest函数。但不起作用

还有别的办法吗


提前感谢:)

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

global.Date = jest.fn(() => DATE_TO_USE);
未经修改的
日期
在后续的
设置
调用中将不可用:

const DATE_TO_USE = new Date(date);
没有必要为实现提供
jest.fn
,它可以在每次测试中更改。由于它是预期的
Date
对象,因此可以使用原始
Date
创建实例:

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');
});

调试输出
console.log(今天)
,并确保在我运行每个测试时它都是jest mock.Ha,并为我提供模拟的测试。当我同时运行所有测试时,它给出了正常的日期
date。mockReturnedValue
抛出错误。它显示Date.mockReturnedValue不是函数。这是一个输入错误。它真的有效吗?我在TypeScript中使用了上面的代码,但是类型“DateConstructor”上不存在属性“mockReturnValue”。ts(2339)@choasia该问题不涉及ts,难怪代码会导致类型问题。尝试断言一个类型,
(日期为jest.Mock)。mockReturnValue(…)
@estus Aha,它现在可以工作了。非常感谢你。顺便说一下,我决定使用
const dateToUse=新日期(“2018年10月16日星期二11:49:11”);jest.spyOn(全局,“日期”).mockImplementation(()=>dateToUse)以避免上述类型问题。
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');
});