2017-03-07 89 views
0

我有以下RSpec的片段:水豚不等待完成click_button提交行動「保存」

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

如果沒有「休眠1」豚不會等待被激發的操作保存按鈕,規格失敗。隨着睡眠1是好的,但有沒有更好的解決方案?

請注意,此測試使用selenium webdriver在Firefox中運行。

我的版本:

  • 軌4.1.12
  • rspec的2.99.0
  • 水豚2.4.4
  • 硒的webdriver 3.2.1
  • 火狐51.0.1

回答

0

您沒有爲您的提交操作包含代碼,但是如果有任何異步就像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是一個應該很少使用的柺杖,特別是隨着越來越多的庫/框架轉向普通的JS而不是使用JQuery。正確的解決方案是在頁面上設置一個可視化更改的期望。 –

+0

我同意,但問題只包括服務器端更改的測試。理想情況下,會有一個視覺指標,這就是功能規格應該尋找的。對記錄更新等服務器端更改的測試屬於請求規範。 –

0

當你點擊一些使用水豚也不能保證通過點擊觸發的任何動作都完成方法返回時。這是因爲水豚除了點擊屏幕上的元素之外,對瀏覽器的功能一無所知。您不需要睡覺,而需要檢查頁面上可視變化的內容,以指示單擊完成按鈕觸發的操作。這可能是一條消息,提示保存成功發生或消失的元素,等等的東西沿着

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 

注意臺詞:你還需要更新水豚 - 2.4.4於2014年10月發佈,已經有從那以後進行了很多改進。

+0

我嘗試了你的建議,看起來沒什麼問題,它不可靠。有時候測試失敗,出現錯誤:'失敗/錯誤:page.should have_text(I18n.t(:identification)+':'),期望在「」中找到文本「Identification:」。 「in」「'是非常可疑的,不知怎的,一箇中間狀態被水豚的信息所掩蓋,這是一個空白的頁面。 –

+0

@TiborNagy它應該像'Capybara.default_max_wait_time'設置得太短,不適合你正在運行的硬件。增加它或將':wait'選項傳遞給have_text –

+0

我還以爲它,但'Capybara.default_max_wait_time'已經是10. –