使用test utils而不是重新呈现组件在reactjs组件上调用setState

Kel*_*gan 7 reactjs jestjs

我在基于jest的测试中有以下代码:

it('will show the hero loop if there is one', function() {

    var React = require('react/addons');
    var ShowsDetailHeader = require('../../../../routes/shows/components/ShowsDetailHeader.jsx');
    var mockData = require('../../../../mock/episodeDetailData');
    mockData.data.show.assets._webHeroVideoUrl = 'https://test.video.com';

    var Subject = require('../../../../mock/stubRouterContext')(ShowsDetailHeader,  {
      show: mockData.data.show
    });

    var TestUtils = React.addons.TestUtils;

    var showsHeader = TestUtils.renderIntoDocument(
      <Subject />
    );

    showsHeader.setState({
      showVideo: true
    });

    var videoClass = TestUtils.findRenderedDOMComponentWithClass(showsHeader, 'flex-video').getDOMNode().getAttribute('class');

    expect(videoClass.indexOf('in')).toBe(-1);

    console.log(videoClass);


  });
Run Code Online (Sandbox Code Playgroud)

我之前的测试测试了组件的初始状态.我现在想要在状态改变后调用setState来检查组件.我在这里登录的videoClass保持不变.我在反应0.12.最新的开玩笑0.4.0.

关于如何测试设置状态后发生的事情的任何想法?

小智 1

setState是异步的,所以你可能需要

showsHeader.setState({
      showVideo: true
    });
jest.runAllTicks();
find ...
expect ...
Run Code Online (Sandbox Code Playgroud)

但我认为状态应该是私有的,不应该直接更改,状态应该在组件内部更改,由 ui 事件或数据更改引起。props如果您想从外部更改组件,则可以使用公共选项。