2016-05-18 8 views
4

私はレンダリングにはReactを、テストにはJest/Jasmineを使用しています。私は古いJest/Jasmine waitsForrunsを使用してテストを書いていますが、これはJasmine 2になりました。新しいdone asyncsと置き換える方法がわかりません。Jestを使ってReact rendered非同期データをテストするには?

私のコードでReactは、ユーザーについて小さなページをレンダリングします。そのページには、ユーザー投稿を取得するためのAJAX呼び出しがあります。私はユーザーの投稿がうまく戻ってきたことをテストしたいと思います。waitsForは非常にうまくいきました。ユーザーが投稿をするまで待ってから続行してください。

Jestテストの中でAJAXコールを使用することについて話している人がたくさんいます。これは私が望んでいないものです。 My JestテストではAJAX呼び出しが行われているかどうかわからないため、結果が返るまで待つ方法が必要です。ここで

waitsForrunsと私の現在のコードです:

it('loads user post',() => { 
    var page = TestUtils.renderIntoDocument(
     <UserPage params={{user: 'fizzbuzz', 'pass': 'xxx'}} /> 
    ); 

    waitsFor(() => { 
     return page.state.posts.length > 0; 
    }, "post loaded", 10000); 

    runs(() => { 
     var posts = TestUtils.scryRenderedDOMComponentsWithClass(page, 'post'); 
     expect(posts.length).toEqual(10); 
    }); 
}); 

どのように私はwaitsForrunsを削除し、作品ジャスミン2.0のコードで置き換えることができますか?すべてのJestテストの知識では、page.state.posts.lengthは0より大きくなければならず、expect何かを入力する必要があります。

答えて

2

このテストを2つの単体テストにリファクタリングして、コードをより厳密にテストする必要があります。テストを互いに独立させ、より洗練された範囲でエラーを特定するのに役立ちます。

it('generates the expected properties for a page', function() { 
    var page = TestUtils.renderIntoDocument(
     <UserPage params={{user: 'fizzbuzz', 'pass': 'xxx'}} /> 
    ); 

    expect(page.someProperty).toBeDefined(); 
    expect(page.user).toEqual('fizzbuzz'); 
}); 

it('generates the correct number of posts from a given page object', function() { 
    var fakePage = { 
     // put your fake mock data here that TestUtils expects 
    }; 

    var posts = TestUtils.scryRenderedDOMComponentsWithClass(fakePage, 'post'); 

    expect(posts.length).toEqual(10); 
}); 

私はあなたのrenderIntoDocument関数内で何が起こっているのかあまりわからない - これらは、私はあなたのコードがどのようなものであるかを知っているが、ここで私が見ることを期待する線に沿って何かしていないと正確ではありません一番上のテストは少し壊れているかもしれません...関数の中であまりにも多くのことが起こっているように見えるか、関数が代わりに行う呼び出しをテストする必要があります。あなたが何をしているのか詳しく説明するなら、私は答えを編集します。

+0

私のゆっくりと戻ってきて申し訳ありません!ありがとうございました!あなたが正しい方向にいると思うので、私はアップヴォートを1つ追加しました。 renderIntoDocumentは自分のコードではありませんが、Reactのコードです。私のリアクションコンポーネントは、リアルに作られているかのようにレンダリングされます。 ReactでレンダリングするとAjaxが実行され、Ajaxが正常に完了したことを確認しようとしています。 Ajaxは内部のレンダリングされたReactコンポーネントを完成させることができ、テストでその値をチェックするので、これは古いジャスミンで可能でした。しかし、これまでJasmine 2では不可能でした。 – FizzBuzz

+0

@FizzBu​​zz心配しない - 私に戻ってくれてありがとう!私は明らかに、現時点ではReactで暗闇の中で少ししか見ていない。しかし、ネイティブのReact関数であれば、この関数を書く開発者(つまり反作用の作成者)が既にテストしているはずだから、このロジックをテストすることを勧めないだろう。その機能を直接テストするのではなく、それは私がとにかくお勧めするものです。私が誤解していたら謝罪します - 私が言ったように、まだリアクトには達していません。 – Shakespeare

関連する問題