如何在 react/redux 应用程序中开玩笑地访问组件的子组件

Posted

技术标签:

【中文标题】如何在 react/redux 应用程序中开玩笑地访问组件的子组件【英文标题】:How to access child of a component in jest in a react/redux app 【发布时间】:2017-12-08 14:53:05 【问题描述】:

我喜欢在 Redux 应用程序中测试 Connect 内的组件:

this.component = TestUtils.renderIntoDocument(<Provider store=store><Header path=this.path /></Provider>);

我不知道如何在 Provider 中访问 Header...(因为从 CLI 运行笑话时,我无法在调试器中停下来。

所以当我试图让一个孩子进入 Header 时

      const path = findDOMNode(self.component.refs.pathElemSpan);
      console.log("path="+path)

路径未定义

有什么建议吗?

谢谢

【问题讨论】:

【参考方案1】:

你在找这个吗?

function Welcome(props) 
  return <h1>Hello, props.name</h1>;


function App() 
  return (
    <div>
      <Welcome name="Sara" />
      <Welcome name="Cahal" />
      <Welcome name="Edite" />
    </div>
  );


ReactDOM.render(
  <App />,
  document.getElementById('root')
);

【讨论】:

【参考方案2】:

使用enzyme,你有一堆不错的选择器可以在你的虚拟 DOM 王国中导航。 :)

http://airbnb.io/enzyme/

访问组件的超级简单测试:

import  mount  from 'enzyme'
import Header from './header'

//... in your test
const wrapper = mount(<Provider store=store><Header path='foo' /></Provider>)
const header = wrapper.find(Header).first()
expect(header.exists()).toBe(true)
// you can even check out the props
expect(header.prop('path')).toBe('foo')

此示例使用mount,但您也可以选择进行浅层渲染。我强烈建议您喝点东西并阅读一下文档。 ;)

【讨论】:

【参考方案3】:
import Foo from '../components/Foo';


const wrapper = mount(<MyComponent />);

expect(wrapper.find(Foo)).to.have.lengthOf(1); //you can use this one
expect(wrapper.find('Foo')).to.have.lengthOf(1); //you can use this one as well

【讨论】:

这个答案似乎是使用 Enzyme 的包装器,它是随 jest 自动安装的。确保您记下您的答案所需的任何额外依赖项。如果您建议提问者使用 Enzyme,请说明原因。

以上是关于如何在 react/redux 应用程序中开玩笑地访问组件的子组件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React Redux 应用程序中使用装饰器?

获取数据时如何在 React Redux 应用程序中显示加载指示器? [关闭]

如何在 React Redux 中访问存储状态?

在 React Redux 中如何构建应用程序以将组件与状态原子解耦

react+redux 中如何通过请求动作处理中间件并触发成功动作?

如何开玩笑地从覆盖报告生成中删除快照的考虑