2012-08-02 3 views
2

capybara에서 문제가 발생하기 때문에 요청 테스트가 실패합니다. capybara가 계속 진행하기 전에 Ajax 이벤트가 완료되기를 기다리지 않기 때문입니다.Capybara 아약스 경쟁 조건

Google에서 다음과 같이 사용해야 함을 나타낼 수 있습니다. 하지만 작동하지 않습니다.

이 문제가 있음을 입증하려면 ajax 호출 후 sleep 문을 넣어 실패한 테스트를 해결할 수 있습니다. 이것은 적절한 실행 지연이 테스트를 실행하는 시스템의 속도에 따라 달라 지므로 어떤 나쁜 습관이라도 해킹당하는 것처럼 보입니다. 그리고 적절하게 큰 값을 선택하면 Ajax 작업이 많은 테스트 스위트 실행 속도가 심각하게 느려집니다.

실패/통과 테스트의 예는 다음과 같습니다.

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 

이 카피 바라의 버그인가, 아니면 내가 뭔가 잘못하고있는 중이 야 : 저장에 클릭하기 전에 수면 page.should have_content에 ('사용자 정의 항목을') 실패/통과의 차이를 만드는가? 어떤 도움

감사합니다 ...

답변

4

나는 잠시 다시이 문제가 있고, 아약스 요청이 완료되면 알아 내기 위해이 방법을 사용 :

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

을 여전히 꽤 해키하지만, sleep을 사용하는 것보다 약간 낫습니다. 나는 here에서 그것을 얻었다. 나는 오이 기능을 사용하고 있지만 rspec 요청 사양에서도 작동해야합니다.

업데이트 (2013년 6월 19일)

wait_until가 버전 2.0에서 카피 바라에서 제거하고, 참조 : Why wait_until was removed from Capybara를하는 이유에 대한 자세한 내용은.

나는 제안 중 하나 따르고 (I 정당화 생각하는) 단지이 하나의 경우에, 어쨌든 그것을 구현했습니다 :

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

감사합니다, 즉 임의의 수면보다 훨씬 낫다! – Chris