如何使用jest测试 Date.now?

blog

最近工作中遇到一个需求, 需要在 post 接口 request 的 headers 中塞一个 timestamp 字段, 值为当前时间的时间戳. 实现方式很简单, 只需要在 api 封装的 post 方法的 headers 中新增 timestamp: Date.now() 即可. 然后想当然的在单元测试关于 headers 的 toEqual 中同时也加上该字段, 跑一遍 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;
  });
}

评论区

加载评论中...