2013-01-16 64 views
7

在我的測試中,我有一個步驟,我填寫一個字段並按回車。該字段然後返回下一頁上的結果集。在水豚使用睡眠有更好的選擇嗎?

這裏是我的助手方法:

def search(term) 
    fill_in('query-text', :with => term) 
    click_button('search-button') 
end 

之後,我有一個步驟,簡單地說:

page.should have_content(tutor) 

然而,問題是,即使我的頁面加載與後頁結果,它通過後的步驟,即使它應該是錯誤的。我在步驟中設置了一個調試器,當我手動檢查它時,斷言失敗,因爲我也期望它。我的假設是,下一步是在頁面重新加載之前檢查。我把睡眠在我的搜索方法的結束,使它看起來像:

def search(term) 
    fill_in('query-text', :with => term) 
    click_button('search-button') 
    sleep 5 
end 

但我覺得用睡眠來解決這個問題一個哈克的方式。我正在使用Capybara 2,所以使用wait_until被刪除。有沒有更好的方法來處理這個問題,而不是依靠睡眠?

回答

1

此測試通過,因爲tutor已經存在於頁面上。

所以你應該檢查不是爲tutor而是其他的東西,例如,對於僅在頁面重新加載後才存在的文本tutor的元素。

1

您是否已經隱藏HTML頁面中的tutor文字? has_content?返回true任何HTML中的文本,包括隱藏的文本是不可見的。所以我寧願用expect(page).to have_text(tutor)替換它,它只檢查頁面上的可見文本。 .text也是非常慢的方法,所以這些額外的分割秒可能會很方便。

另一種方法是在你規範助手恢復wait_until方法,因爲它是在大多數情況下,非常方便:

def wait_until(timeout = DEFAULT_WAIT_TIME) 
    Timeout.timeout(timeout) do 
    sleep(0.1) until value = yield 
    value 
    end 
end 

在任何情況下,它會比每次都等待一個固定的超時更好。