假设我有一个导出默认函数的简单文件:
// UniqueIdGenerator.js
const uniqueIdGenerator = () => Math.random().toString(36).substring(2, 8);
export default uniqueIdGenerator;
我会这样使用:
import uniqueIdGenerator from './UniqueIdGenerator';
// ...
uniqueIdGenerator();
我想在我的测试中Assert这个方法被调用了,同时保留了原来的功能。我想用jest.spyOn
来做,但是,它需要一个对象和一个函数名作为参数。你怎么能用一种干净的方式来做呢?有一个类似的GitHub issue for jasmine
给任何感兴趣的人。
8条答案
按热度按时间tkqqtvp11#
下面是一种在不修改导入(甚至根本不需要在测试中导入)的情况下为默认导出执行此操作的方法:
3z6pesqy2#
在某些情况下,您必须模拟导入才能发现默认导出:
nkoocmlb3#
仅模拟默认导出或任何其他导出,但将模块中的剩余导出保留为原始导出:
bqf10yzr4#
对我有效的是Janne Annala的答案和OP自己的解决方案的组合。我想要测试的是helper方法是否被正确的参数调用,因为我已经为helper方法编写了一个测试,它对我随后的测试没有任何影响:
nxagd54h5#
使用“default”作为spyOn函数中的第二个参数。
oymdgrw76#
这里就更简单了。
使用
jest
模拟导出的模块“addDelay”(其中包含sleep
函数)。测试如下所示,并检查
sleep
函数是否在1秒内调用,如arg所示。g6baxovj7#
我最终放弃了默认导出:
然后我可以这样使用和窥探它:
Some recommend将它们 Package 在一个常量对象中,并将其导出。我想您也可以使用类进行 Package 。
然而,如果你不能修改这个类,仍然有一个(不太好的)解决方案:
型
eaf3rand8#
也可以模拟导入并将原始实现作为模拟实现传递,如: