Typescript 中使用Jest测试时如何自定义返回固定日期完成断言
实现方案
先修正原有代码的语法问题,再根据你的场景选择对应实现方式:
方案1:直接传入固定日期参数(可控入参场景首选)
如果你可以直接控制service.report的入参,直接把activeFrom替换为目标固定值即可:
it('reports fix date', async () => { const fixedActiveFrom = '2020-04-19T10:01:58.135Z'; aService.returnValue = [{ activeFrom: fixedActiveFrom }]; const somethingSpy = jest.spyOn(PubSub, 'topic'); await service.report([ { activeFrom: new Date(fixedActiveFrom), // 直接传入固定日期 } ]); expect(somethingSpy).toHaveBeenCalledWith( expect.objectContaining({ activeFrom: fixedActiveFrom }) ); // 测试完成后恢复spy,避免影响其他用例 somethingSpy.mockRestore(); });
方案2:Mock全局时间固定Date返回(内部生成日期场景)
如果activeFrom是在service.report内部生成、你无法直接控制入参,可以用jest的假定时器固定全局系统时间:
it('reports fix date', async () => { const fixedActiveFrom = '2020-04-19T10:01:58.135Z'; // 固定全局当前时间为指定日期,之后所有new Date()调用都会返回这个时间 jest.useFakeTimers().setSystemTime(new Date(fixedActiveFrom)); aService.returnValue = [{ activeFrom: fixedActiveFrom }]; const somethingSpy = jest.spyOn(PubSub, 'topic'); await service.report([ { // 此时addDays基于固定的系统时间计算,返回值永远固定 activeFrom: addDays(new Date(), 30), } ]); expect(somethingSpy).toHaveBeenCalledWith( expect.objectContaining({ activeFrom: fixedActiveFrom }) ); // 测试完成后恢复定时器和spy,避免影响其他用例 jest.useRealTimers(); somethingSpy.mockRestore(); });
补充说明
如果你需要校验的是日期对象而非字符串,把期望中的fixedActiveFrom替换为new Date(fixedActiveFrom)即可,jest会自动比对日期的时间戳是否一致。
内容的提问来源于stack exchange,提问作者DEV_K
相关产品推荐
相关产品推荐

