使用Jest用 prop 模拟React组件

fruv7luv  于 2022-12-08  发布在  Jest
关注(0)|答案(6)|浏览(249)

我有一个React组件,它包含一些其他组件,这些组件依赖于Redux存储等的访问,这在进行完整的Enzyme挂载时会导致问题。

import ComponentToMock from './ComponentToMock';

<ComponentToTest>
  ...some stuff
  <ComponentToMock testProp="This throws a warning" />
</ComponentToTest>

我想使用Jest的.mock()方法来模拟子组件,这样它就不会成为测试的关注点。
我知道我可以模拟出一个直的组成部分与这样的东西:
jest.mock('./ComponentToMock', () => 'ComponentToMock');
但是,由于该组件通常会接收props,React会感到不安,并发出警告,警告未知props(在本例中为testProp)被传递到<ComponentToMock />
我试着返回一个函数,但是你不能在Jest mock中返回JSX(我可以告诉你),因为它被提升了。在这种情况下,它会抛出一个错误。
所以我的问题是
a)获取ComponentToMock以忽略传递给它的 prop ,或者
b)返回一个React组件,该组件可用于模拟我不担心测试的子组件。
或者......有没有更好的办法?

oyxsuwqo

oyxsuwqo1#

jest.mock()的文档底部有一条注解,用于防止提升行为:
注意:使用babel-jest时,对mock得调用将自动提升到代码块得顶部.如果要显式避免此行为,请使用doMock.
那你就照你所描述的去做:返回一个不需要测试的组件的存根函数。

jest.doMock('./ComponentToMock', () => {
  const ComponentToMock = () => <div />;
  return ComponentToMock;
});

const ComponentToTest = require('./ComponentToTest').default;

命名存根组件是很有帮助的,因为它是在快照中呈现的。

juzqafwq

juzqafwq2#

自从我提出这个问题以来,我学到了更多的东西。下面是一个替代的(更好的?)方法来处理需要传递 prop 的模拟组件:使用模块 * 模拟文件 *。
首先在组件文件夹下的__mocks__文件夹中创建一个与要模拟的组件同名的文件,例如

.
|- /ComponentToMock.js
└- /__mocks__/ComponentToMock.js <-- create this folder/file!
  • 注意 *:在编写本文时,文件夹 * 必须 * 被命名为__mocks__(您需要在每个需要模拟组件的文件夹中创建__mocks__。))

接下来,在这个模拟文件中,您可以根据需要编写文件,例如:

// This code would live in ./__mocks__/ComponentToMock.js
import React from 'react';
const ComponentToMock = ({ testProp }) => <div>A mock with '{testProp}' passed!</div>;
export default ComponentToMock;

然后在测试文件中,将Jest mock语句更改为:jest.mock('./ComponentToMock');
当Jest遇到没有第二个函数参数的.mock()时,它会自动寻找__mocks__文件夹。然而,即使mock语句在被测试的组件中被提升,这也不会影响mock本身的导入--这就是为什么它能够导入和编译React组件的原因!
这似乎对需要传递 prop 的模拟组件很有效,否则如果返回一个空函数,就会产生 prop 警告(但是如果组件不接收 prop ,继续使用也是完全可以接受的)。我希望这能帮助一些人。

xfb7svmp

xfb7svmp3#

除了可接受的答案外,如果您使用多个导出,则可以按照以下方式进行模拟:
第一个
参考博客:https://thoughtbot.com/blog/mocking-react-components-with-jest

webghufk

webghufk4#

在我的情况下,我无法使模拟工作。
一个原来是区分大小写的问题:
模块文件名:Autosuggest.js
我是如何嘲笑它:jest.mock('./AutoSuggest', ...);〈--错误病例

sqserrrh

sqserrrh6#

Jest推荐的默认导出组件,非常适合我
https://jestjs.io/docs/next/tutorial-react
jest.mock('../SomeDirectory/SomeComponent', () => 'SomeComponent');

相关问题