【问题标题】:Testing a component that depends on store from context从上下文测试依赖于 store 的组件
【发布时间】:2016-04-03 17:36:12
【问题描述】:

我在为依赖于从上下文传递的 redux 存储的组件设置测试时遇到问题...

我的应用有一个根组件,它为其子级提供 redux 存储作为上下文:

import ApplicationStore from './app-store.js'

class Root extends Component {
    getChildContext() {
        return { store: ApplicationStore }
    }
    render(){...}
}

Root.childContextTypes = {
  store: PropTypes.object,
};

我有一个依赖于商店的组件(从上下文传递下来):

class List extends Component {
  render(){
    const items = this.context.store.getState();

    return items.map((_, i) => (
      <div key={i}>{_.name}</div>
    ));
  }
}

List.contextTypes = {
  store: PropTypes.object,
};

所以我的问题是:如何将 store 对象“注入”到组件的上下文中?我必须unmock(./app-store.js)吗?此外,我怎样才能在商店中预先填充几个灯具?

谢谢!

【问题讨论】:

    标签: unit-testing reactjs redux jestjs


    【解决方案1】:

    我知道这不能回答您的问题,但我想向您指出有关上下文的 React.js 文档:

    大多数应用程序永远不需要使用上下文。特别是如果你刚刚开始使用 React,你可能不想使用上下文。使用上下文会使您的代码更难理解,因为它会使数据流变得不那么清晰。它类似于使用全局变量通过应用程序传递状态。

    不要使用上下文通过组件传递模型数据。通过树显式地线程化数据更容易理解。使用上下文会使您的组件更加耦合且可重用性更低,因为它们的行为会因渲染位置不同而有所不同。

    如果您使用 props 将您的 store(或者甚至只是它的必需部分)传递给您的子组件,那么您的问题已经解决了,因为在您的测试中,您可以简单地注入您的 mocked 或 stubbed store。

    【讨论】:

    • 谢谢,@妮可。当我编写应用程序并决定将 store 作为上下文传递时,我通读了它,但我并没有完全考虑清楚。
    • 另外,如果你在 Redux 中使用 React,你应该使用官方的“React Redux”库来将你的组件挂接到 store (github.com/reactjs/react-redux)。它为您管理商店订阅。从那里,您可以专注于测试只接受道具的“普通”组件,以及您编写的mapStateToProps 函数,而不必担心尝试测试任何涉及商店的东西。请参阅 Usage With ReactWriting Tests 文档页面。
    • 谢谢,@markerikson。我最终用 react-redux 中的&lt;Provider /&gt; 包装了我的根组件。
    猜你喜欢
    • 1970-01-01
    • 2022-08-10
    • 2020-01-11
    • 2021-08-08
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 2020-10-18
    相关资源
    最近更新 更多