如何使用 Redux connect 中的操作对测试组件进行快照?

Posted

技术标签:

【中文标题】如何使用 Redux connect 中的操作对测试组件进行快照?【英文标题】:How do you snapshot test components with actions from Redux connect? 【发布时间】:2017-10-03 09:49:57 【问题描述】:

我想对在其 componentDidMount() 处理程序中调度 redux 操作的反应组件进行快照测试。动作是通过 Redux 的connect() 给组件的。

我应该如何模拟这个动作?

现在该操作已导入组件中(请参阅下面的 Newsfeed.js)。那么在我的测试中如何将它换成模拟动作呢?

我正在使用 redux-thunk 进行异步操作,但这并不重要。

app/components/Newsfeed.js

import React,  Component  from 'react';
import  connect  from 'react-redux';

// An action that makes an async request to get data
import  loadNewsfeedStories  from '../actions/Newsfeed';

class Newsfeed extends Component 
  componentDidMount()
    this.props.loadNewsfeedStories();
  

  ...


export default connect(state => (
  stories: state.newsfeed.stories
),

  loadNewsfeedStories
)(Newsfeed)

app/tests/Newsfeed.test.js

import React from 'react';
import  Provider  from 'react-redux';

// This creates a mockStore using my reducers and a saved JSON state.
import  mockStore  from './MockState';

// The component to test
import Newsfeed from '../components/Newsfeed';

test('Newsfeed matches snapshot', () => 
  const wrapper = mount(
    <Provider store=mockStore>
      <Newsfeed />
    </Provider>
  );

  expect(wrapper).toMatchSnapshot();
);

可能的解决方案

    导出未连接的组件,并手动传入所有道具和模拟动作。与仅使用 mockStore 和提供程序相比,将需要大量额外的编码。此外,我们不会测试“已连接”组件。

    使用类似Nock的东西?似乎拦截了 HTTP 调用,因此 ajax 请求实际上不会去任何地方。

    对于axios,有一个叫moxios的lib——https://github.com/mzabriskie/moxios

【问题讨论】:

【参考方案1】:

您可以尝试导出不同的连接组件,但要使用模拟的“mapDispatchToProps”函数。这样,任何操作都不会通过。

但就个人而言,在测试组件时。我写了一个模拟 reducer,这些不应该改变状态,而是记录所有调度的动作(Jests 模拟函数对此非常有用)。这样,您还可以测试单击按钮时是否调度了正确的操作,...

【讨论】:

【参考方案2】:

同时测试组件、redux 存储和模拟 http 请求是个坏主意,因为单元测试应该很小。

另一种选择是避免在componentDidMount 中执行业务逻辑。 而不是写

componentDidMount() this.props.loadNewsfeedStories();

您可以将此逻辑移至 redux 模块(取决于您使用的库)。 如果你只使用 redux-thunk 而没有像 saga 或 redux-logic 这样的库,你可以使用这个https://github.com/Rezonans/redux-async-connect。

但记录所有派发的动作

Redux thunk 很难测试。您的模拟调度程序将仅接收一组函数。而且您无法验证函数是由loadNewsfeedStories() 还是由someAnotherThunk() 创建的。

【讨论】:

以上是关于如何使用 Redux connect 中的操作对测试组件进行快照?的主要内容,如果未能解决你的问题,请参考以下文章

分区表的操作对索引的影响

一些我容易混淆的知识(关于数组的操作对字符串的操作)

jquery的引入入口函数选择器对内容的操作对元素的操作属性操作

索罗斯的操作对区块链意味着什么?

如何使用 thunk 操作对 mapDispatchToProps 进行单元测试

P20:Redux进阶-React-redux中的Provider和connect