2017-11-04 12 views
0

Ajaxコールが成功した後で、<Loading />が完了した後で、レンダリングされた場合、コンポーネントをテストするにはどうすればよいでしょうか?Ajaxの後でレンダリングされるテストリアクトコンポーネント(Jest&Enzyme)

私はJest and Enzymeを使用しています。ただし、Enzymeでは、スナップショットはAjax呼び出し後の最終的なレンダリング状態ではなく、読み込みコンポーネントを持つPersonになります。私は私のAjaxコールを嘲笑する必要がありますが、それは擬似で何のように見えるでしょうし、その後スナップショットを取る?

class Person extends Component { 
... 
    componentWillMount() { 
    // ajax call to person data, including ID 
    // on successful Ajax completion, set state.personID and other values, etc. 

    axios.get('.../person', { 
     params: { 
     AltID: 12345 
     } 
    }).then(function (response) { 
     this.setState({personID: response.data.personID,...}); 

    }).catch(function (error) { 
     ... 
    }); 
    } 

    render() { 
     if (!this.state.personID) { 
     return (
      <div className="App"> 
      <Loader /> 
      </div>); 
     } 
     return (
     <div className="App"> 
      ... 
      Person ID: {{this.state.personID}} 
      ... 
     </div> 
    ); 
    } 
} 

酵素スナップショットテスト(飾る必要があります):テストでthis.setState({personID: value})の設定など

describe('Person',() => { 
    it('renders correctly',() => { 
    const rendered = renderer.create(<Person />); 
    expect(rendered.toJSON()).toMatchSnapshot(); 
    }); 
}); 

最後に、そのような周りの作業は、実際の未発表のシナリオでは、私は以来、探しされるものではありませんcomponentWillMountは、Ajax呼び出しを実行してユーザーを認証します。現在、エラーページにプッシュされています。

答えて

0

apiコールをhttps://facebook.github.io/jest/docs/en/tutorial-async.htmlにすることも、2つのテストを行うこともできます.1つは条件がTrue、もう1つは条件がFalseです。あなたのAPI呼び出しは状態をある状態から別の状態に変更するだけです。状態に応じてすべてが正しくレンダリングされているかどうかをテストする必要があります。

例:先端のための

test('the data is peanut butter', done => { 
    function callback(data) { 
    expect(data).toBe('peanut butter'); 
    done(); 
    }W 

    fetchData(callback); 
}); 
+0

感謝。しかし、テストすることができるスニペットまたは擬似コードをまとめてもいいですか?私はそれが参考になる決定的な解決策または例を探している他の人に役立つと思います。さらに、それはまた、他の人によるあなたの答えをupvotingするのに役立ちます... – user1322092

+0

私は投稿したリンクにたくさんの例があります。しかし、正直なところ、Uは、レンダリングがあなたの条件に一致するかどうかをテストすることができます。personIDがあればXをレンダリングし、そうでなければYをレンダリングします。いずれにせよ、そのリンクに行き、あなたの非同期機能をテストするのとまったく同じです。 –

+0

ありがとう...しかし、どのようにJestでコンポーネントのAPIコールを模擬しますか?状態プロパティ( 'this.setState({personID:value}) ')の設定など、コンポーネントを迂回することはありませんか?あなたが共有したドキュメントでは、ファーストクラスのAPIコール(個別のファイル)を嘲笑して表示しますが、コンポーネント内のコンポーネントについては、 'componentWillMount'の呼び出し(またはデータを使用しない' Person.userAuthorized'応答ではなく、むしろ200 HTTP応答コード? – user1322092

関連する問題