React Jest 以匹配快照,在测试带有子组件的组件时崩溃
React Jest to match snapshot, crash when testing component with child components
我有一些组件包含来自第三方的子组件 addons/libraries。我使用 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 中对组件进行单元测试的正确方法是什么?
到目前为止,我发现模拟 React 组件的最简单方法是使用:
jest.mock('component', ()=> 'ComponentName')
在你要测试的模块的导入语句之前。
第一个参数是全局 npm 模块的名称或本地组件的路径(请注意,该路径是相对于您的测试文件的路径)。第二个参数只是一个 return 字符串的函数(我总是 return 与我在 jsx 中使用的名称相同)。这将导致转储组件除了与原始组件同名外什么都不做。因此,在您的快照中,您将看不到任何区别,除了模拟组件不会呈现任何子组件。
现在查看您收到的错误消息。
jest.unmock('ChildComponet.js') was called but automocking is disabled...
问题是您使用 jest.unmock
而不是 jest.mock
。 Jest 具有自动模拟模块的所有依赖项的功能。启用自动模拟后,您可以使用 jest.unmock
为一些基本库(如 lodash 或 moment)获得真正的植入。由于自动模拟功能让很多人感到困惑,他们决定将其设为可选。 Tldr 你试图取消模拟一些最初没有被模拟的东西,因为你没有启用自动模拟。
TypeError: Cannot read property 'DEFINE_MANY' of undefined
当您启用自动模拟时,每个导入的模块都会被替换为 undefined
。关于 unmockedModulePathPatterns
设置我不能说太多,但我相信你必须使用与导入模块相同的模式,所以如果它是全局的,你不必将路径放在 node_modules
里面的文件夹。
我有一些组件包含来自第三方的子组件 addons/libraries。我使用 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 中对组件进行单元测试的正确方法是什么?
到目前为止,我发现模拟 React 组件的最简单方法是使用:
jest.mock('component', ()=> 'ComponentName')
在你要测试的模块的导入语句之前。
第一个参数是全局 npm 模块的名称或本地组件的路径(请注意,该路径是相对于您的测试文件的路径)。第二个参数只是一个 return 字符串的函数(我总是 return 与我在 jsx 中使用的名称相同)。这将导致转储组件除了与原始组件同名外什么都不做。因此,在您的快照中,您将看不到任何区别,除了模拟组件不会呈现任何子组件。
现在查看您收到的错误消息。
jest.unmock('ChildComponet.js') was called but automocking is disabled...
问题是您使用 jest.unmock
而不是 jest.mock
。 Jest 具有自动模拟模块的所有依赖项的功能。启用自动模拟后,您可以使用 jest.unmock
为一些基本库(如 lodash 或 moment)获得真正的植入。由于自动模拟功能让很多人感到困惑,他们决定将其设为可选。 Tldr 你试图取消模拟一些最初没有被模拟的东西,因为你没有启用自动模拟。
TypeError: Cannot read property 'DEFINE_MANY' of undefined
当您启用自动模拟时,每个导入的模块都会被替换为 undefined
。关于 unmockedModulePathPatterns
设置我不能说太多,但我相信你必须使用与导入模块相同的模式,所以如果它是全局的,你不必将路径放在 node_modules
里面的文件夹。