2017-03-07 8 views
0

を「保存」click_buttonに提出するアクションを完了するのを待つことはありません:カピバラは、私は以下のRSpecのフラグメントを持つ

describe "Save should create a ClassificationScheme" do 
     subject { lambda { click_button "Save"; sleep 1 } } 
     it { should change(ClassificationScheme, :count).by(1) 
    end 

「スリープ1」カピバラなしで保存で発生するアクションを待ちません。ボタンを押してスペックが失敗します。睡眠1とOKですが、より良い解決策はありますか?このテストは、セレンwebdriverをを使用して、Firefoxで動作していることを

注意、。

マイバージョン:

  • レール4.1.12
  • RSpecの2.99.0
  • カピバラ2.4.4
  • セレンwebdriverを3.2.1
  • のFirefox 51.0.1

答えて

0

あなたの送信アクションのためのコードが含まれていませんでしたが、何も非同期の進行があるかどうon、Ajaxリクエストのように、送信アクション自体はすぐに終了しますが、非同期タスクは依然としてリクエストを処理しています。

# spec/support/wait_for_ajax.rb 
module WaitForAjax 
    def wait_for_ajax 
    Timeout.timeout(Capybara.default_max_wait_time) do 
     loop until finished_all_ajax_requests? 
    end 
    end 

    def finished_all_ajax_requests? 
    page.evaluate_script('jQuery.active').zero? 
    end 
end 

RSpec.configure do |config| 
    config.include WaitForAjax, type: :feature 
end 

コード礼儀Thoughtbot:そのような場合、あなたはこのようなヘルパーを使用することができます。これはのみの機能仕様でのヘルパーが含まれていることを

。したがって、あなたの仕様にtype: :featureとタグを付けるか、上記のconfig.include行を変更して、使用している仕様の種類に含めるようにしてください。

describe "Save should create a ClassificationScheme" do 
    subject { lambda { click_button "Save"; wait_for_ajax } } 
    it { should change(ClassificationScheme, :count).by(1) 
end 
+0

wait_for_ajaxは、より多くのライブラリが/フレームワークはjQueryのを使用するのではなく、プレーンなJSに移動し、特にとして、非常にまれに使用されなければならない松葉杖です。正しい解決策は、ページ上の視覚的な変化に対する期待を設定することです。 –

+0

私は同意しますが、質問にはサーバー側の変更のテストしか含まれていませんでした。理想的には、ビジュアルインジケータが存在し、それがフィーチャ仕様が探しているものです。レコードの更新などのサーバー側の変更のテストは、要求仕様に属します。 –

0

あなたはメソッドが返すときにそのクリックによってトリガ任意のアクションが完了している保証はありませんカピバラを使って何かをクリックすると:それを使用する

。これは、Capybaraがブラウザ上で要素をクリックしたこと以外は何も知らないためです。睡眠の代わりに、ボタンをクリックしてトリガーされたアクションが完了したことを示すために、ページ上で視覚的に変化するものを確認する必要があります。 - 2.4.4は2014年の10月にリリースされた、があったあなたもカピバラを更新する必要があります:それは

describe "Save should create a ClassificationScheme" do 
    subject { lambda { click_button "Save"; page.should have_text('Classification Saved' } } 
    it { should change(ClassificationScheme, :count).by(1) 
end 

ノートの線に沿って何かなどの保存が正常に起こったかの要素が消えるというメッセージであってもよく、それ以来多くの改善がなされています。

+0

私はあなたの提案を試みましたが、それは信頼できるものではないと思われるものです。時にはテストがエラーで失敗する: '失敗/エラー:page.should have_text(I18n.t(:identification)+ ':')、" "でテキスト" Identification: "を見つけると予想される。 「in」は非常に疑わしいもので、何とか中間の状態は空のページであるcapybaraによって陰謀されました。 –

+0

@TiborNagyあなたが走っているハードウェアには 'Capybara.default_max_wait_time'が短すぎるようにしてください。それを増やすか、または 'wait :: 'オプションを通してhave_text –

+0

私はそれも考えましたが、' Capybara.default_max_wait_time'はすでに10です。 –

関連する問題