1

現在、私のRailsアプリケーションの時間追跡機能のテストを書いています。タイマーの「再生」ボタンをクリックして、数秒待ってから、一時停止をクリックしてフォームを送信する(新しいタイムスタンプオブジェクトを作成する)ことをシミュレートする方法を理解できません。Rails:カピバラの統合テストでストップウォッチをテストするにはどうしたらいいですか?

test "track time with stopwatch" do 
    visit new_project_timestamp_path(@project) 
    find('#play_button').click 
    sleep 4.0 
    find('#pause_button').click 
    click_button "submit_new_timestamp" 
    visit project_path(@project) 
    assert page.has_content? "4 seconds" 
end 

^これは、私はそれが何をしたいの要旨であるが、それは完全にスレッドを一時停止するので、私はストップウォッチを行いながら、「周りを待つ」の種類にテストをしたいのに対し、睡眠は明らかに、動作しません。数秒間その事をする。実際に時間が追跡されないため、上記のテストは失敗します。一時停止はタイマーの目の中で再生直後にクリックされるので、実際の時刻が記録されずにフォームが提出されますが、もちろん検証エラーがスローされます。

実際にスレッドを一時停止せずに数秒待ってシミュレーションする方法はありますか?

答えて

0

(注:Tom Walpole氏のおかげで非常に感謝しています。 JS対応のWebドライバ。私が持っていたのと同じ不足のために、同様の問題を抱えている誰かのためにこれを書くと思った。)

Javascriptを実行するWebドライバを使用していないという問題があります。デフォルトでは、Capybaraは速く、Javascriptを実行しない:rack_testドライバを使用します。

JSが実行されている(私の場合はストップウォッチとのやりとり)に依存する統合テストでは、:poltergeistのようなものが良い考えです。設定するには、

gem 'poltergeist' 
    gem 'phantomjs', :require => 'phantomjs/poltergeist' 

をGemfileに追加し、bundle installを実行してください。

あなたのテスト/仕様ヘルパーファイルに

require 'capybara/poltergeist' 
    Capybara.javascript_driver = :poltergeist 

を追加する必要があります。 JS対応の統合テストが必要な場合は、Capybara.current_driver = Capybara.javascript_driverと設定するだけです。

0

JS対応ドライバ(セレニウム、ポルターガイスト、カピバラウェブキット)を使用している場合、ブラウザ、テスト対象のアプリケーション、およびテストはそれぞれ独自のスレッド/プロセスで実行されるため、テストスレッドでスリープ状態にする必要があります良い。時間の差がない両方のクリックを送信するのではなく、click_buttonがすぐ後にvisitによって取り消されている可能性が高いため、新しいタイムスタンプが作成されていません。あなたはassert_textを使用して、さらに新しいページに

click_button "submit_new_timestamp" 
page.assert_text "Timestamp created" # whatever message/visible change occurs after clicking the button 
visit project_path(@project) 

を要求するために、ブラウザを伝える前に、新しいタイムスタンプのアクションを作成完了していることを確認するには「click_button`と 『訪問』の間の目に見える変化のいくつかの種類のために主張する必要があります、assert_selector、assert_title、assert_current_pathマッチャーは、アサーションが失敗した場合、より良いエラーメッセージを提供します。

+0

エラーメッセージフォーム(およびテストログ)は、フォームのseconds_elapsedフィールドが入力されないことを示します。 これは、jQueryを使用してサブミット時にストップウォッチによって追跡された秒数で埋められます。それが適切に実行されていないか、まったく実行されていないと思われます(これは開発と運用では問題ありません)。 私はドライバを切り替えようとします、多分それはそれを解決するでしょう。もしそうでなければ、おそらくテスト環境にしか現れていないjQueryコードのどこかにバグがあります。 –

+0

@BenLawtonどのようにフォームフィールド、JSクリックハンドラを埋めるのですか?もしそうなら、JS対応ドライバを使用していますか?(デフォルトのcapybaraラックテストドライバはJSを実行しません) –

+0

もともとデフォルトを使っていましたが、 'Capybara.javascript_driver =:selenium'を設定してみました。 –

関連する問題