私はReact Test Utilitiesを使って自分のコードのユニットテストをしています。私はrenderIntoDocument
に電話してカスタムコンポーネントをレンダリングし、findDOMNode
を使ってレンダリングされたものをテストします。私が実行している問題は、状態を更新して単体テストのコンテキスト内で再レンダリングを効果的にトリガする方法がわからないことです。React DOMを使用した単体テストの状態変更をどのようにトリガできますか?
はここにいくつかのサンプルコードです - コードのコメントに注意を払う:
import React from 'react';
import ReactDOM from 'react-dom';
import TestUtils from 'react-dom/test-utils';
import MyCustomComponent from '../../app/components/MyCustomComponent';
describe('My Test Suite',() => {
let component, node;
test('verify state change',() => {
const items = [{'value': '1'}];
component = TestUtils.renderIntoDocument(
<MyCustomComponent items={items} />
);
node = ReactDOM.findDOMNode(component);
expect(node.querySelector('input[type=text]').value).toEqual('1');
component.state.items = [{'value': '2'}];
// do something here to trigger a re-render?
expect(node.querySelector('input[type=text]').value).toEqual('2');
});
});
は、残念ながら、それは単に何もしない状態変数を変更するようです。それは定義されていないので、component.componentWillReceiveProps()
に電話することはできません。
私が同じコンポーネントに、新しいコンポーネントで置き換えるのではなく、そのレンダリング関数を呼び出すようにしてください。その理由は、コンポーネントがthis.state
の代わりにthis.props
に基づいて物をレンダリングしていたバグが見つかり、初期値ではなく状態からのデータを常に使用していることを示すテストが必要なためです。
ReactDOM.render( 、node);コンポーネントを強制的にレンダリングするには? –
@MarouenMhiriはコンポーネントの新しいインスタンスを効果的に作成するだけではありませんか? (既存のインスタンスを再レンダリングするのではなく) – SoaperGEM
これは、コンポーネントを再マウントする代わりに更新されます。私はこれがあなたが探しているものだと思います。 –