2017-02-28 6 views
0

ほとんどの現代的なソーシャルメディアサイトにある「リンクプレビュー」機能を模倣したReactコンポーネントがあります。あなたは、リンクを入力し、それがCapybaraでテスト中に意図的にAJAX応答を遅らせるには?

enter image description here

私が反応成分を有することにより、これを行う...など、画像、タイトルをフェッチAJAXは、URLのプレビューデータをフェッチするために自分のサーバーにコールバックします。

私が中間の「ロード」状態(すなわち、いくつかのロードアイコンや糸車)を示しフェッチだが

関連はisLoadingAttachment状態変数にのみ有効であるか注意

this.setState({ isLoadingAttachment: true }) 

return $.ajax({ 
    type: "GET", 
    url: some_url, 
    dataType: "json", 
    contentType: "application/json", 
}).success(function(response){ 
    // Succesful! Do Success stuff 
    component.setState({ isLoadingAttachment: false }) 
}).error(function(response) { 
    // Uh oh! Handle failure stuff 
    component.setState({ isLoadingAttachment: false }) 
}); 

ようスニペットが見えますリアクトサーバーがフェッチを実行している間、短い秒間です。成功シナリオとエラーシナリオの両方が即座に無効になります。

Capybaraの機能仕様で「ローディング中」の機能をテストしたいと思います。私はすべてのWeb呼び出しとサーバーから返されるデータを嘲笑しましたが、すべてが速く起こって、「ロード」状態を通過してからexpect()..ステートメントを実行することさえできます。また、意図的にwait_for_ajaxと呼ぶことはありませんので、ページはajaxを待たずに進みますが、まだ速すぎます。

最後に、意図的にサーバーコールを1.0秒遅らせることも試みましたが、それもうまくいきませんでした。私は、全体が何とかシングルスレッドなので、私は仮定しますか?

# `foo` is an arbitrary method called during the server-side execution 
allow_any_instance_of(MyController). 
    to receive(:foo) { sleep(1.0) }.and_call_original 

どうすればいいですか?

ありがとうございます!

答えて

2

Capybaraは、テストとは別のスレッドでアプリケーションサーバーを起動しますが、デフォルトのCapybara.server設定を使用している場合は、デフォルトでwebrickを使用しているため、アプリケーションを呼び出す際に問題が発生することがあります。代わりにCapybara.server = :pumaを指定する必要があります。それを超えて、応答を模倣することは、一般的に、機能仕様(実際にはエンドツーエンドのテストであることが意図されています)では悪い考えです。あなたは

proxy.stub('https://example.com/proc/').and_return(Proc.new { |params, headers, body| 
    sleep 2 
    { :text => "Your results"} 
}) 
+0

おかげのような何かを行うことができるようになるアプリのコードの外側のモックウェブ応答に - https://github.com/oesmith/puffing-billy - よりよい解決策はpuffing-billyのようなものを使用することです!もう1つのフォローアップ - 'puma'が' webrick'よりもサーバーにとってより良い選択になるのは何ですか?私はサーバが無関係であると思っていたでしょう。両方とも同じ種類の応答を生成するからです。 – user2490003

+0

@ user2490003 'puma'はデフォルトでマルチスレッドで、複数の同時リクエストを処理します(同じリクエストを別のリクエスト) - 99%は、あなたがプロダクションでwebrickを使用していないと確信しています。できるだけ多くのテストをenvに一致させることがベストです。 –

+0

あなたは正しいです、私は生産でプーマを使用しています。説明をありがとう! – user2490003

関連する問題