如何在测试中改变反应状态

How to change the react state in testing

我有下面的代码,

export default class CampaignTrustSticky extends Component {
  constructor(props) {
    super(props);
    this.state = {
      showTrustBlock: false
    };
  }
  render () {
    let { showTrustBlock } = this.state;
    return(
      <section
        className={classNames('trust-sticky', {
          'pull-up': showTrustBlock
        })}
      >
      </section>
    )
  }
}

在我的测试用例中,我是这样使用的,

it('Render Campaing TrustKey', () => {
    let wrapper = shallow(<CampaignTrustSticky />);
    expect(wrapper.find('sectaion.pull-up')).not.toBe(null)
});

在这个测试中它失败了,因为默认状态值设置为 false。那么我如何才能将测试用例的状态值更改为 true 以成功该用例?

it('Render Campaing TrustKey', () => {
    let wrapper = shallow(<CampaignTrustSticky />);
    wrapper.setState({ showTrustBlock: true });
    expect(wrapper.find('sectaion.pull-up')).not.toBe(null)
});

但是您的测试代码应该测试您的组件是否工作。您正在更改测试中的状态,但组件不会更改它的状态。

您应该在组件中实现更改状态的功能并对其进行测试。例如按下按钮或类似的东西。

jonathanrz 的回答是正确的。虽然,您的组件并没有真正正确编写。该组件中的状态如何改变?这样写就永远是false

该组件看起来应该从父组件接收 "showTrustBlock" 作为道具。

所以,最好的办法是将 "showTrustBlock" 作为父组件的 prop 传递,然后你可以通过传递不同的 props 轻松测试它。

此外,如果您这样做,您可以将组件重写为无状态功能组件。