私のテストでは、子コンポーネントを追加するイベントをトリガーした後で、自分のコンポーネントの1つがライフサイクルメソッドを終了するまでメインスレッドをブロックしたいと考えています(componentDidUpdate()
)。それ自体に。どうすればいいですか?このようなリアクションコンポーネントの更新が完了するまで待つ
何か:
describe('my <Component />',() => {
it('should do what I want when its button is clicked twice',() => {
const wrapper = mount(<Component />);
const button = wrapper.find('button');
// This next line has some side effects that cause <Component /> to add
// some children components to itself...
button.simulate('click', mockEvent);
// ... so I want to wait for those children to completely go through
// their lifecycle methods ...
wrapper.instance().askReactToBlockUntilTheComponentIsFinishedUpdating();
// ... so that I can be sure React is in the state I want it to be in
// when I further manipulate the <Component />
button.simulate('click', mockEvent);
expect(whatIWant()).to.be.true;
});
});
は(私は、今、私はこの警告を得るためにこれをしたい:
Warning: setState(...): Can only update a mounted or mounting component. This usually means you called setState() on an unmounted component. This is a no-op.
私は私のテストが引き起こすので、私はそれを取得しています信じているし、私のコンポーネントが内部の状態をReactの内部マルチスレッドマジックよりも速く変えることができるので、今度はbutton.simulate('click')
を2回実行するまでにReactが新しい子コンポーネントをインスタンス化しましたが、まだマウントを完了していません。反応を完了させるための更新私のコンポーネントとその子をすると、その問題を解決するための最良の方法です)
クリックハンドラは何をしますか?すべての状態の変更は、特にタイマー/非同期のものがある場合を除き、同期している必要があります。 – Jacob
DOMアップデートは、あなたが変なことをしているか、Reactのエキゾチックな風味を使っていない限り、同期しています。あなたの 'setState'警告が、あなたのコンポーネント自体がマウント前に' setState'を実行していることが原因であると私は驚いていません。 – Jacob
@Jacob私はサードパーティのライブラリ[React Widgets](https://jquense.github.io/react-widgets/docs/)を使用しています。私の ''はその子の1つとしてReact Widgets 'DateTimePicker'を持っていて、警告は' DateTimePicker'の中から出ているようです。残念ながら、私は自分のイベントの原因を変えることができると確信しています。コンポーネントを調べて、それが間違っていないことを確認することは簡単にできません。 –
Kevin