2012-08-02 115 views
2

我經常遇到水豚問題與請求測試失敗,因爲水豚沒有等待ajax事件完成前繼續前進。水豚ajax競爭條件

谷歌似乎表明我應該使用:resynchronize選項爲我的測試來解決這個問題。但它不起作用。

爲了證明這是一個問題,可以通過在ajax調用之後放置sleep語句來修復失敗的測試。這看起來很糟糕,因爲適當的延遲會根據運行測試的機器的速度而變化。選擇一個合適的大值會嚴重減慢運行一個包含大量Ajax操作的測試套件。

一個失敗/通過測試的例子如下。點擊保存之前的睡眠,使路過的區別/上page.should have_content失敗(「自定義項目」):

it "should be able create a new todo item", :js, :resynchronize, :focus do 
    # Visit new action 
    visit new_todo_list 


    # Fill in the name 
    fill_in "#name", "test list" 

    # Click on add item to launch inline popup 
    find('a.add-item').click 
    within '#new_item' do 
    fill_in 'todo_item_description', :with => 'custom item' 
    # Run ajax action to add currrent item 
    find('.btn').click 
    end 

    sleep(1) 

    # Save 
    find('a.save').click 

    page.should have_content('test list') 
    page.should have_content('custom item') 

end 

這是水豚的錯誤還是我做錯了什麼?

感謝您的幫助......

回答

4

我有這個問題而回,並用這種方法計算出當Ajax請求完成:

wait_until do 
    page.evaluate_script('$.active') == 0 
end 

還是蠻哈克,但稍好於使用sleep。我從here得到它。我將它用於Cucumber功能,但它也應該可以在rspec請求規範中使用。

更新(2013年6月19日)

wait_until從水豚在2.0版本中刪除,請參閱:Why wait_until was removed from Capybara對於爲什麼細節。

我已經遵循的一個建議,反正實現了它,只爲這一個情況下(我認爲是有道理的):

def wait_until 
    require "timeout" 
    Timeout.timeout(Capybara.default_wait_time) do 
    sleep(0.1) until value = yield 
    value 
    end 
end 
+0

謝謝,這是不是任意的睡眠好多了! – Chris 2012-08-02 13:13:36