2013-08-26 77 views
0

我正在使用Capybara和Poltergeist來測試使用setTimeout定期刷新頁面內容的索引頁。頁面內容在三種狀態之間轉換,基於外部服務,並且每種狀態都有一個盒式磁帶。使用多個VCR磁帶盒測試JavaScript刷新

我試圖測試使用這樣的代碼刷新:

VCR.use_cassette 'object_new' do 
    visit index_path 
    page.should have_content 'New' 
end 

VCR.use_cassette 'object_running' do 
    page.should have_content 'Running' 
end 

VCR.use_cassette 'object_complete' do 
    page.should have_content 'Complete' 
end 

第一have_content成功,但第二次卻沒有。水豚應該等待任何異步調用返回並更新DOM,以便這些斷言通過。我試過using_wait_time強制斷言在ajax調用返回後等待,但它沒有幫助。有什麼想法可能會從我的規範中失去使這項工作?該功能在瀏覽器中有效;這只是沒有通過的測試。

回答

0

最初的實現實際上是正確的,但我的JS沒有足夠的彈性來處理服務器錯誤。請求正在磁帶重新加載之間被解僱,並且正在返回非成功的HTTP狀態。

更新JS來處理錯誤的請求和繼續輪詢解決了這個問題,最後是JS應該如何表現。

2

當您使用poltergeist驅動程序運行測試時,您的頁面實際上是在單獨的進程中呈現的(即phantomjs進程)。

這意味着如果您的JavaScript加載了任何外部內容,PhantomJS將實際加載外部內容而不是加載VCR卡帶,因爲VCR隻影響運行您的測試的Ruby進程中發出的HTTP調用。

與其試圖用Capybara測試你的JS代碼,你應該考慮測試你的JS,例如Jasmine,在那裏你將有機會嘲笑外部服務的調用。

+0

對Rails應用程序調用外部服務,並且JS正在訪問RESTful API。我想測試整個堆棧,這就是爲什麼我更願意使用Rails應用程序的API並在後端使用VCR模擬服務。這就是問題所在。當JS根據規範調用API時,它應該已經改變了磁帶盒(因爲JS正在調用我的Rails應用程序正在運行的測試版本),但是我仍然得到響應,就好像第一個磁帶已加載。 – jmacdonald

+0

你如何協調來自JS代碼的AJAX調用與更換磁帶? AJAX調用很可能在您更換磁帶之後或之前發生,因爲它們是在單獨的過程中發生的。可能值得添加一些時間戳記錄到您的磁帶更改和控制器,以查看何時提出請求。 – lmars

+1

看着AJAX響應,他們報告了500錯誤,這就是測試失敗的原因。查看測試日誌不會顯示任何其他細節。 AJAX位每5秒鐘重試一次,所以即使它在第一次嘗試中沒有得到正確的響應,它最終也會如此。我認爲盒式磁帶切換不會導致錯誤,因爲當沒有盒式磁帶請求時,錄像機通常會發出很大聲音。第一頁。該斷言確實通過了,因爲它是值得的。 – jmacdonald