javascript - 如何在连接的 React-Redux 组件中测试 componentWillMount?

标签 javascript reactjs redux chai enzyme

我有以下智能组件,它使用 componentWillMount 生命周期方法进行异步调用以获取数据。我正在为它编写测试,但我无法测试该函数是否被调用以及是否调用它是在组件安装之前调用的。它们是需要涵盖的重要案例。

智能组件的代码如下:

const mapStateToProps = (state) => {   const context = state.context;  return {
    isError: context.error,   }; };

const options = {   componentWillMount: (props) => {
    const { dispatch } = props;
    dispatch(fetchContextUser());   }, };

export function App(props) {   return (
    <div className="app">
      { props.isError ? (<ContextError />) : (<Main />) }
      { props.children }
    </div>   ); }

App.propTypes = {   children: PropTypes.object, // eslint-disable-line react/forbid-prop-types   isError: PropTypes.bool.isRequired, // eslint-disable-line react/forbid-prop-types };

export default connect(mapStateToProps, null)(functional(App, options));

我正在使用 Enzyme、Chai 和其他模拟适配器来测试此组件。测试 block 如下:

describe.only('Render Connected Component', () => {   let store;   beforeEach(() => {
    store = mockStore({
      context: {
        error: false,
      },
    });   });   it('Should render connected components', () => {
    const connectedWrapper = mount(
      <Provider store={store}>
        <ConnectedApp />
      </Provider>
    );
    expect(connectedWrapper).to.be.present();   }); });

I just want to test two things :

1.) fetchContextUser is called 2.) fetchContextUser is called before the component gets mounted

最佳答案

我认为@pedro-jiminez 很接近,但这里缺少两个元素:

  • 为了在 enzyme 中调用componentWillMount,您需要使用mount,而不是shallow
  • 该答案假定 fetchContextUser 是一个 prop,并且可以用 spy 替换。在这种情况下,您可能希望在测试中 stub store.dispatch 并断言它是通过 fetchContextUser 调用的,假设这只是一个纯函数。

所以测试看起来像:

describe.only('Render Connected Component', () => {
  let store;
  beforeEach(() => {
    store = mockStore({
      context: {
        error: false,
      },
    });
    // stub dispatch
    sinon.stub(store.dispatch);
  });
  it('Should render connected components', () => {
    const connectedWrapper = mount(
      <Provider store={store}>
        <ConnectedApp />
      </Provider>
    );
    expect(connectedWrapper).to.be.present();
    // Now test dispatch called
    expect(store.dispatch.calledOnce).to.be.true;
    expect(store.dispatch.args[0][0]).to.deepEqual(fetchContextUser());
  });
});

关于javascript - 如何在连接的 React-Redux 组件中测试 componentWillMount?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40615415/

相关文章:

javascript - 使用 jQuery 单击页面中的某处时关闭下拉菜单?

javascript - 在php中完成表单提交后是否可以重定向回来?

javascript - 如何选中/取消选中 react 中的复选框列表

reactjs - 使用有状态组件绕过 redux 是一种不好的做法吗?

javascript - 在发布包中包含.d.ts(typescript的声明文件)有什么好处?

javascript - 更改自定义主题 Material-UI

javascript - 如何使用 react-native 为 android 创建日期选择器?

reactjs - 文件中的两个 useContext

javascript - 在 React 中处理巨大的 10 列表排序的最佳方法?

javascript - 带数组的一键多项功能