2017-03-07 4 views
0

나는 다음과 같은 RSpec에 조각이 있습니다에 의해 트리거되는 액션을 기다리지 않는다 "잠 1"카피 바라없이카피 바라가 click_button에 제출 작업을 완료 할 때까지 기다리지 않고 "저장"

describe "Save should create a ClassificationScheme" do 
     subject { lambda { click_button "Save"; sleep 1 } } 
     it { should change(ClassificationScheme, :count).by(1) 
    end 

을 저장 버튼이 나타나고 사양이 실패합니다. 수면 1은 괜찮지 만 더 좋은 해결책이 있습니까?

참고 :이 테스트는 selenium webdriver를 사용하는 Firefox에서 실행됩니다.

내 버전 :

  • 레일 4.1.12
  • RSpec에 2.99.0
  • 카피 바라 2.4.4
  • 셀레늄 webdriver 3.2.1
  • 파이어 폭스 51.0.1

답변

0

제출 작업을위한 코드를 포함하지 않았지만 비동기식 작업이있는 경우 on, Ajax 요청처럼 제출 동작 자체가 빨리 끝나고 비동기 작업이 요청을 계속 처리합니다.

# spec/support/wait_for_ajax.rb 
module WaitForAjax 
    def wait_for_ajax 
    Timeout.timeout(Capybara.default_max_wait_time) do 
     loop until finished_all_ajax_requests? 
    end 
    end 

    def finished_all_ajax_requests? 
    page.evaluate_script('jQuery.active').zero? 
    end 
end 

RSpec.configure do |config| 
    config.include WaitForAjax, type: :feature 
end 

코드 예의 Thoughtbot : 그런 경우에는,이 같은 도우미를 사용할 수 있습니다.

참고 이것은 기능 사양의 도우미 만 포함합니다. 따라서 사양을 type: :feature으로 태그하거나 위의 config.include 행을 변경하여 사용중인 사양 유형에 포함 시키십시오.

는이 기능을 사용하려면 당신이 카피 바라가 클릭에 의해 트리거 조치가 때 메소드가 리턴을 완료 한 보증은 없다 사용하여 뭔가를 클릭

describe "Save should create a ClassificationScheme" do 
    subject { lambda { click_button "Save"; wait_for_ajax } } 
    it { should change(ClassificationScheme, :count).by(1) 
end 
+0

wait_for_ajax는 매우 드물게 사용되는 버팀목입니다. 특히 점점 더 많은 라이브러리/프레임 워크가 JQuery를 사용하는 대신 일반 JS로 이동하기 때문에. 올바른 해결책은 페이지의 시각적 변화에 대한 기대치를 설정하는 것입니다. –

+0

동의하지만 질문에는 서버 측 변경 테스트 만 포함되었습니다. 이상적으로는 시각적 표시기가있을 것이고, 이것이 기능 사양에서 찾아야 할 것입니다. 레코드 갱신과 같은 서버 측 변경에 대한 테스트는 요청 스펙에 속합니다. –

0

. 이것은 Capybara가 화면에서 요소를 클릭 한 것 이외에 브라우저가하는 일에 대해 아무것도 모르기 때문입니다. 잠자는 대신 페이지에서 시각적으로 변경되는 내용을 확인하여 단추를 클릭하여 트리거 된 동작이 완료되었음을 나타낼 수 있습니다. 즉,

describe "Save should create a ClassificationScheme" do 
    subject { lambda { click_button "Save"; page.should have_text('Classification Saved' } } 
    it { should change(ClassificationScheme, :count).by(1) 
end 

주의 라인을 따라 저장이 성공적으로 일어난라는 메시지 또는 사라지는 요소 등 뭔가 할 수있다 : 당신은 또한 카피 바라를 업데이트해야합니다 - 2.4.4은 2014 년 10 월에 출시 된,이 있었다 그 이후로 많은 개선이있었습니다.

+0

나는 당신의 제안을 시도했다. 그것은 괜찮은 것 같다. 조금 신뢰할 수 없다. 때로는 테스트가 '실패/오류 : page.should have_text (I18n.t (: identification) +': ') 오류로 실패하고 ""에서 "Identification :"텍스트를 찾을 것으로 예상됩니다. 'in' ''은 꽤 의심 스럽습니다. 여하튼 중간 상태는 카피 바라 (capybara)라는 빈 페이지에 의해 양도되었습니다. –

+0

@TiborNagy 실행중인 하드웨어에 대해'Capybara.default_max_wait_time' 설정이 너무 짧아야합니다.그것을 늘리거나'wait 옵션을 사용하여 have_text –

+0

나는 또한 생각했지만'Capybara.default_max_wait_time'는 이미 10입니다. –