javascript - 如何在React 16中测试componentDidMount()中setState()触发的重新渲染

标签 javascript reactjs

我有一个组件,当我在 componentDidMount() 中调用 setState() 时,该组件会触发重新渲染。这是示例代码:

import React from 'react'

class MyComponent extends React.Component {
  constructor (props) {
    super(props)
    this.state = {
      message: 'Hello'
    }
  }

  componentDidMount () {
    this.fetchMessage().then((message) => {
      this.setState({ message })
    })
  }

  fetchMessage() {
    return Promise.resolve('World')
  }

  render() {
    return this.state.message
  }
}

我的测试是这样的:

import MyComponent from './MyComponent'
import { shallow } from 'enzyme'

describe('<MyComponent>', () => {
  it('renders World', () => {
    const wrapper = shallow(<MyComponent />)
    expect(wrapper.text()).toEqual('World') # => results shows Hello
  })
})

请注意,我正在使用 enzyme 来协助我的测试。

测试失败,因为返回的结果是Hello,这是初始渲染。

所以我的问题是如何确保在执行断言之前触发重新渲染?

最佳答案

你好,

您必须使用mount如果你想测试lifeCycleMethod。

请注意,setState 是异步的,因此如果 this.fetchMessage 需要时间,您会发现自己在渲染和测试中陷入了美丽的竞争条件。

为了避免这种情况,请尝试将渲染提取到无状态函数中。

关于javascript - 如何在React 16中测试componentDidMount()中setState()触发的重新渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47917185/

相关文章:

javascript - 在 React 状态中存储自动更新的对象

reactjs - 为应用程序创建单个 MobX 商店的最佳方式是什么?

Javascript如何在html表单提交中使用多个函数来验证

javascript - 如何让 Chart.JS 条形图将每个条形上的两个数据值堆叠在一起,并在每个条形上打印计算值?

reactjs - react 大日历风格的日期有事件

javascript - 滚动时关闭下拉菜单

reactjs - 检测react-router中后退按钮被按下

javascript - 带零的十进制正则表达式

javascript - ExtJs 动画 - 无限显示/淡入淡出元素

javascript - 为添加到 DOM 的元素添加 Click 事件