在需要测试的代码中,我使用
import dayjs from 'dayjs';
import utc from 'dayjs/plugin/utc';
dayjs.extend(utc);
dayjs().add(15, 'minute')
在我的测试中,我需要模拟dayjs,以便在比较jest
中的快照时始终具有相同的日期,所以我这样做了
jest.mock('dayjs', () =>
jest.fn((...args) =>
jest.requireActual('dayjs')(
args.filter((arg) => arg).length > 0 ? args : '2020-08-12'
)
)
);
它会失败
TypeError: _dayjs.default.extend is not a function
不幸的是,类似的问题在这里没有帮助我。我怎么能嘲笑默认的dayjs
和extend
?
3条答案
按热度按时间hfyxw5xn1#
您 * 可以 * 为
dayjs
编写一个更全面的手动mock,这个mock包含extend
方法,但是这样您就将测试耦合到了第三方接口。“不要mock您不拥有的东西” -您最终将不得不在mock中重新创建越来越多的dayjs
接口,然后如果接口发生变化,您的测试将继续通过,但是 * 您的代码将被破坏 *。或者,如果您决定交换到不同的时间库,则必须重写所有测试以手动模拟新接口。相反,把时间当作一种依赖关系,在你自己的模块中有你自己的函数,它只是把当前时间作为一个
Date
对象:然后,当您需要创建
dayjs
对象时,* 从该对象开始 *(dayjs()
相当于the docs的dayjs(new Date())
):现在,在测试中,您可以交换出实际拥有的东西,而完全不必干扰
dayjs
:现在,如果
dayjs
的新版本改变了你对它的使用方式,你的测试将失败,并告诉你同样的信息。或者,如果你换到一个不同的时间库(here's,一个使用Moment的例子),你不必重写你所有的测试,所以你可以确信你已经正确地交换了。此外,FWIW我不评价快照测试--它只是变成了变化检测,不相关的变化会失败,并鼓励人们忽略测试结果,如果任何东西失败了,盲目地重新创建快照。测试基于您希望从组件中看到的 * 行为 *。
gorkyyrv2#
您可以尝试以下操作:
对我有用。
s1ag04yj3#
模拟dayjs像你希望的那样,不要忘记设置静态函数如下: