无法测试连接的组件

时间:2020-04-07 10:58:33

标签: reactjs redux react-redux enzyme

我有下一个问题: 在每个测试用例之前,我都会创建一个容器

const container = shallow(<Provider store={mockStore}><ReportButton{...mockProps}/></Provider>).dive();

因此,当我尝试查找()一些元素以模拟事件时,会出现错误。

在快照显示的组件本身中,而不在内部标记中。

<ReportButton
  category={Array []}
  count={100}
  dataId=""
  filter={Object {}}
  fullReport={false}
  isEmpty={false}
  loading={false}
  period_tariff_is_active={true}
  type=""
/>

我简直无法进入组件内部。

一个简单的解决方案:按照Redux DOCS的建议,无需在Provider中包装就可以测试组件。 因此,您只需要为组件添加命名的导出即可,如下所示

export default connect(mapStateToProps, mapDispatchToProps)(ReportButton);
export {ReportButton};

恭喜,您现在可以测试组件了。

但是,如果您使用react-redux钩子(例如useSelect),则此技巧将不起作用,因为您的组件将自动包装在connect中。然后您将导出这样的组件:

export default ReportButton;

所以问题又回来了。 而且我不知道该如何解决。

已用软件包列表:

"react": "^16.9.0",
"redux": "^4.0.4",
"react-redux": "^7.1.1",
"enzyme": "^3.11.0",
"enzyme-adapter-react-16": "^1.15.2",

1 个答案:

答案 0 :(得分:0)

我用酶测试了海关提供者。测试看起来像:

wrapper = Enzyme.shallow(
      <StorageProvider storage={storageMock}>
        <StorageContext.Consumer>
          {(storage: StorageService | null): React.ReactElement => 

            <HelperComponent storage={storage} />}

        </StorageContext.Consumer>
      </StorageProvider>,
    );

expect(
  wrapper
    .dive()
    .find(StorageContext.Consumer)
    .dive()
    .find(HelperComponent),
  ).toHaveLength(1);

因此您可以尝试使用.dive


我建议的另一种解决方案是使用@testing-library/react进行测试,因为我认为测试具体实现的组件行为更容易且有趣。