2012-07-13 21 views
4

我已經爲我的Rails 3.2應用程序編寫了一些RSpec測試,並且因爲我彈出瀏覽器彈出來,我試圖從Firefox更改爲capybara-webkit。 之後,所有測試仍在運行,除了一個。發生故障的線路是:更改爲capybara-webkit後單個測試失敗

expect { click_button "Create" }.to change(Answer, :count).by(count) 

如果我刪除了期待,並添加之前和之後採取截圖的方法,我可以看到,測試正常運行。但是如果我通過調試器低谷,日誌會告訴我記錄是在第二個截圖行後創建的。我可以永遠等待click_button,並在執行下一行後執行相應的Controller動作。

「創建」按鈕是一個標準的html按鈕,在創建操作中不涉及JS。有沒有對這種奇怪的行爲進行解釋?

回答

6

在Capybara發送點擊操作到服務器和您的測試檢查數據庫之間存在競爭條件。

解決這個最簡單的方法就是檢查之前要等待:

expect { click_button "Create"; sleep 2 }.to change(Answer, :count).by(count) 

我不喜歡這樣。測試這種方法的更好方法是從最終用戶的角度進行檢查。

例如,點擊「創建」後,用戶是否在答案頁面上看到答案?

fill_in :title, :with => "My answer" 

click_button 'Create' 

page.should have_text "My answer" 
+0

我嘗試了睡眠,它的工作原理,謝謝!對於第二種選擇:對於這種情況,這是特別的嗎?你不想睡覺在你的測試中,或者這是所有「請求」規格的推薦實踐? – wintersolutions 2012-07-14 01:06:45

+1

請求測試的推薦做法。您希望在其他地方進行大量嘲諷,專注測試,但對於請求規格說明,他們應儘可能少地使用內部知識來測試整個系統。 – 2012-07-14 04:21:12

+0

+1,一百萬感謝! :) – deivid 2013-02-20 12:28:15