React Jest匹配快照,在使用子组件测试组件时崩溃

时间:2016-10-14 13:43:54

标签: javascript unit-testing reactjs jestjs

我有一些组件包含来自第三方插件/库的子组件。我使用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中对组件进行单元测试的正确方法吗?

1 个答案:

答案 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}其中的文件夹。