如何使用jest测试 Date.now?

最近工作中遇到一个需求, 需要在 post 接口 requestheaders 中塞一个 timestamp 字段, 值为当前时间的时间戳. 实现方式很简单, 只需要在 api 封装的 post 方法的 headers 中新增 timestamp: Date.now() 即可. 然后想当然的在单元测试关于 headerstoEqual 中同时也加上该字段, 跑一遍 ut, 发现测试能过, 于是开了一个 MR 指给复审人, 可是此时却发现 ci 上的 ut 关于这里的断言却是有错误的. 在本地多跑几遍后, 发现确实有可能出现 Date.now() 对应不上的情况.

后续仔细一想发现跑不过其实应该才是普遍的现象, 毕竟在给对象添加 timestamp 字段的时间戳不可能与 toEqual 时的时间戳完全一致. 找到错误原因后解决的思路就很简单了, 只需要在 ut 时给 Date.now() 一个固定值就好了.

大致代码:

const MOCK_DATE_NOW = 1530518207007;

const realDateNow = Date.now.bind(global.Date);

describe('api test', () => {
  beforeAll(() => {
    const dateNowStub = jest.fn(() => MOCK_DATE_NOW);
    global.Date.now = dateNowStub;
  });

  afterAll(() => {
    global.Date.now = realDateNow;
  });
}