你如何使用带有props的 Jest 来模拟 react 组件?

IT技术 reactjs unit-testing jestjs enzyme
2021-05-20 13:50:34

必须有一种简单的方法来做到这一点,但我在任何地方都找不到文档化的语法。我有一个带有props的 React 组件,我想像这样在 Jest 中模拟它:

jest.mock('./common/MultiSelect', 'MultiSelect');

这是有效的,除了我最终收到一个 React 警告混淆了我的测试结果:

警告:options标签上的未知props从元素中移除这个props。

我正在嘲笑的组件确实有一个 options props,我真的不在乎它是如何呈现的,那么我如何以不会抛出警告的方式来模拟它呢?我试过在模拟中使用 React.createElement,并返回一个包含元素名称和 props 参数的数组。

我要模拟的组件是这样使用的:

<MultiSelect
options={['option 1', 'option 2']}
/>
3个回答

您正在使用字符串作为第二个参数来模拟组件。这是不寻常的,因为该jest.mock函数需要一个函数作为第二个参数。该字符串可能适用于您的测试(取决于它的呈现方式),但它是Jest 文档中未定义的行为,可能是导致您出现问题的原因。而是传递一个返回组件的函数。这是一个传递一个简单的功能组件的组件,该组件只是将名称传回:

jest.mock('./common/MultiSelect', () => () =><span>MultiSelect</span>);

我发现以下模拟模式在您想查看 Jest 快照中提供的组件名称和props的情况下很有用:

jest.mock('./common/MultiSelect', () => (props) => <mock-MultiSelect {...props} />);

在玩弄它之后,我意识到我返回的组件的语法错误。像这样模拟它:

jest.mock('../../../../../common/components/MultiSelect/MultiSelect', () => () => <div />);

像这样嘲笑它不会(这就是我正在做的):

jest.mock('../../../../../common/components/MultiSelect/MultiSelect', () => <div />);

警告甚至告诉了我这个问题,但我误解了它:

警告:React.createElement:类型无效——需要一个字符串(对于内置组件)或一个类/函数(对于复合组件)但得到:对象。检查 的渲染方法Termination