如何使用 Jest 和 Enzyme 测试具有 Router、Redux 和两个 HOC 的 React 组件?

Posted

技术标签:

【中文标题】如何使用 Jest 和 Enzyme 测试具有 Router、Redux 和两个 HOC 的 React 组件?【英文标题】:How to test a React component that has Router, Redux and two HOCs... with Jest and Enzyme? 【发布时间】:2018-10-21 10:38:56 【问题描述】:

我目前无法找到解决此问题的方法。 我有一个 React 组件,它连接到 React Router 4、Redux 存储并由两个 HOC 包装。它非常疯狂,但这就是它的编码方式。 这是给你一个想法的出口:

export default withFetch(Component)(fetchData, mapStateToProps)

我正在尝试对其进行一些基本测试:

  it('should render self and subcomponents', () => 
    const wrapper = shallow(<Component ...props />)
    expect(toJson(wrapper)).toMatchSnapshot()
  )

输出如下的console.log/snapshot:

<Route render=[Function: render] />

尝试了但没有成功:

    我尝试将我的组件包装在 Memory Router 中 为组件提供一个 redux store 使用.dive().chilndren() 尝试看孩子 尝试mountrender 均未成功。

仍然不断渲染&lt;Route render=[Function: render] /&gt;

试用:

<MemoryRouter>
    <Component ...props />
</MemoryRouter>

仍然产生相同的结果。 请注意,我也尝试将我的组件导入为

import  Component  from './components/'

但它返回未定义。

非常感谢任何帮助。谢谢! ??????????

【问题讨论】:

【参考方案1】:

我假设&lt;Router&gt; 你指的是BrowserRouter。 最好的方法是隔离封装的组件并使用测试替代方案对其进行测试。

例如假设您要测试:

// App.jsx

export const App = () => 
<Router>
  <ReduxProvider>
     <AppInner>
  </ReduxProvider>
</Router>

我的建议是使用 Router 和 ReduxProvider 的测试环境来测试 AppInner

在测试中:

// AppInner.test.jsx

import mount from 'enzyme';
import MemoryRouter from 'react-router';
describe('AppInner', () => 
   it('should do something', () => 
      const TestingComponent = () =>
      <MemoryRouter>
         <ReduxProvider>
            <AppInner />
         <ReduxProvider>
      <MemoryRouter>;
      const component = mount(TestingComponent);
   );
)

注意我已经用MemoryRouter 包裹了AppInner,它允许你的模拟路由器但不依赖于浏览器。

有关更多信息,您可以阅读react-routertesting 部分;

【讨论】:

请注意 mount 完全改变了输出!我使用的是 Shallow。

以上是关于如何使用 Jest 和 Enzyme 测试具有 Router、Redux 和两个 HOC 的 React 组件?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jest-Enzyme 测试样式组件

ReactWrapper::state() 只能在类组件单元测试 Jest 和 Enzyme 上调用

如何使用 Jest/Enzyme 测试去抖功能?

如何使用 jest/enzyme 测试 useEffect 与 useDispatch 挂钩?

如何使用 Jest 和/或 Enzyme 测试由 React 组件呈现的样式和媒体查询

如何使用 Jest 和 Enzyme 对包含 history.push 的反应事件处理程序进行单元测试?