Jest setSystemTime 不适用于全局范围

Dar*_*rio 4 unit-testing mocking reactjs jestjs react-testing-library

我正在尝试测试一个简单的减速器,其日期属性设置为今天。

const today = new Date();

export const initialState = {
  today
};

console.log(new Date().toDateString()); // <--- real date

export default function globalReducer(state = initialState, action) {
  console.log(new Date().toDateString()); // <--- mocked date
  switch (action.type) {
    default:
      return state;
  }
}

Run Code Online (Sandbox Code Playgroud)

通过我的基本测试

import globalReducer from "./reducer";

describe("Global reducer", () => {
  beforeAll(() => {
    jest.useFakeTimers("modern");
    jest.setSystemTime(new Date("2021-02-18"));
  });

  afterAll(() => {
    jest.useRealTimers();
  });

  it("should return the mocked date", () => {
    expect(globalReducer(undefined, {}).today).toEqual(new Date('2021-02-18'));
  });
});
Run Code Online (Sandbox Code Playgroud)

我注意到,模拟仅在减速器代码内起作用,但今天在其全局范围内总是返回真实日期而不是模拟日期。

setSystemTime如果我在测试设置文件中调用,则被today正确模拟。

我在这里错过了什么吗?仅针对特定测试模拟全局范围内的日期的方式是什么?

如果您想查看的话,可以在这里查看测试存储库https://github.com/dariospadoni/jestFakeTimersMock

Ten*_*eff 6

发生这种情况的原因是因为在调用之前Date实例化了。recucer.jssetSystemTime

这是一个如何避免这种情况的示例:

beforeAll(() => {
  jest.setSystemTime(new Date("2021-02-18"));
});

describe("Global reducer", () => {
  let globalReducer;

  beforeAll(() => {
    globalReducer = require("./reducer").default;
  });

  it("should return the mocked date", () => {
    expect(globalReducer(undefined, {}).today).toEqual(new Date("2021-02-18"));
  });
});
Run Code Online (Sandbox Code Playgroud)

这里,Date一旦reducer.js需要,该对象就会被实例化,并且是在setSystemTime调用之后