我有一些组件包含来自第三方插件/库的子组件。我使用Jest进行单元测试和toMatchSnapshot()
方法。我试图用jest.unmock('ChildComponet.js')
排除子组件,我收到此错误:
jest.unmock('ChildComponet.js')但禁用了自动插锁。删除对jest.unmock
的不必要的调用,或通过jest.enableAutomock();
启用此测试的自动锁定。此警告可能是Jest 15中默认配置更改的结果。
我已启用jest.enableAutomock();
,现在我遇到了错误:
TypeError:无法读取未定义的属性“DEFINE_MANY”
我把它放在我的package.json上,但没有任何反应:
“unmockedModulePathPatterns”:[“rootDir / node_modules / react”]
有什么想法吗?
是在React中对组件进行单元测试的正确方法吗?
答案 0 :(得分:1)
模拟我到目前为止发现的反应组件的最简单方法是使用:
jest.mock('component', ()=> 'ComponentName')
在您要测试的模块的import语句之前。
第一个参数是全局npm模块的名称或本地组件的路径(请注意相对于测试文件的路径)。第二个参数只是一个返回字符串的函数(我总是返回我在jsx中使用的相同名称)。这将导致转储组件不执行任何操作,但与原始组件具有相同的名称。因此,在您的快照中,您将看到没有区别,除了模拟的组件不会渲染任何子项。
现在收到错误消息。
jest.unmock('ChildComponet.js')被调用但自动插锁被禁用...
问题是您使用的是jest.unmock
而不是jest.mock
。 Jest具有自动模拟模块所有依赖关系的功能。启用自动模拟后,您可以使用jest.unmock
来获取一些必要的库,如lodash或moment。由于自动模拟功能让很多人感到困惑,他们决定让它成为可选项。 Tldr你试图在第一时间嘲笑一些没有被嘲笑的东西,因为你没有启用自动模拟。
TypeError:无法读取未定义的属性“DEFINE_MANY”
启用自动模拟时,每个导入的模块都替换为undefined
。我不能对unmockedModulePathPatterns
设置说太多,但我相信你必须使用你用来导入模块的相同模式,所以如果它是全局的,你不必把路径放到{{1}其中的文件夹。