You could编写更彻底的手动模拟dayjs
,一个具有extend
方法,但随后您将测试耦合到第三方接口。“不要嘲笑你不拥有的东西”- 你最终将不得不重新创建越来越多的dayjs
模拟中的接口,然后如果该接口发生变化,您的测试将继续通过,但是你的代码将会被破坏。或者,如果您决定切换到不同的时间库,则必须重写所有测试以手动模拟新界面。
相反,将时间视为一种依赖。在您自己的模块中拥有您自己的函数,该函数仅提供当前时间作为Date
object:
export const howSoonIsNow = () => new Date();
然后,当您需要创建一个dayjs
对象,这样做从那 (dayjs()
相当于dayjs(new Date())
per the docs https://day.js.org/docs/en/parse/now):
import dayjs from 'dayjs';
import utc from 'dayjs/plugin/utc';
import { howSoonIsNow } from './path/to/noTimeLikeThePresent';
dayjs.extend(utc);
dayjs(howSoonIsNow()).add(15, 'minute');
现在,在您的测试中,您可以交换您实际拥有的东西,而不必干扰dayjs
at all:
import { howSoonIsNow } from './path/to/noTimeLikeThePresent';
jest.mock('./path/to/noTimeLikeThePresent');
howSoonIsNow.mockReturnValue(new Date(2020, 8, 12));
现在如果有新版本dayjs
如果改变的方式破坏了你对它的使用,你的测试就会失败并告诉你同样多的信息。或者如果您交换到不同的时间库(here's https://stackoverflow.com/a/67317078/3001761一个使用 Moment 的示例)您不必重写所有测试,因此您可以确信您已正确交换。
另外,FWIW 我一般不会评价快照测试 - 它只是成为更改检测,因不相关的更改而失败,并鼓励人们忽略测试结果并在出现任何失败时盲目地重新创建快照。测试基于行为你想从你的组件中看到。