2017-02-26 3 views
1

을 기다릴 내가 얻을 RSpec에 + 카피 바라 + 소리의 요정에서 다음과 같은 오류 :카피 바라 아약스 요청

given!(:user_owner) { create(:user) } 
given!(:second_user) { create(:user) } 
given!(:question) { create(:question, user: user_owner) } 

describe 'as not question owner' do 
    before do 
    login_as(second_user, scope: :user, run_callbacks: false) 
    visit question_path(question) 
    end 

    scenario 'can upvote just one time', js: true do 
    first('a#question-upvote').click 
    expect(first('div#question-score').text).to eq '1' 
    first('a#question-upvote').click 
    expect(first('div#question-score').text).to eq '1' 
    end 

장애/오류 : 예상 (page.first ('사업부의 # 질문 점수') 텍스트입니다.) .TO EQ '-1'내가 잠 1 삽입

expected: "-1" 
     got: "0" 

:

scenario 'can upvote just one time', js: true do 
    first('a#question-upvote').click 
    sleep 1 
    expect(first('div#question-score').text).to eq '1' 
    first('a#question-upvote').click 
    sleep 1 
    expect(first('div#question-score').text).to eq '1' 
end 

테스트 통과.

페이지가 비동기 요청을 기다리지 않았 음을 알았습니다. 잠자기 시간없이 제대로 작동하도록 테스트를 다시 작성하려면 어떻게해야합니까?

P. 영어를 유감스럽게 생각합니다.

답변

3

일치하는 사람 eq을 사용하면 대기 동작이 종료됩니다. 검색된 요소에서 .text을 호출하면 String이 생기고 eq 정규식과 함께 사용하면 해당 문자열을 다시로드하거나 다시 쿼리 할 수 ​​없기 때문입니다. 대기/재 시도 동작을 원하면 Capybara가 제공하는 matchers를 Capybara 요소와 함께 사용해야합니다. 전체 페이지가 변화하고, 그래서 만약 그래서 그 대신 expect(first('div#question-score').text).to eq '1' 당신이

expect(first('div#question-score')).to have_text('1', exact: true) # you could also use a Regexp instead of specifying exact: true 

주목해야 할 또 다른 일을해야

요소의 all/first 비활성화 다시로드 (또는 요소는 텍스트를 기다리는 것이 완전히 대체되고 있습니다) 초기 페이지에 셀렉터와 일치하는 요소가 있지만 실제로는 두 번째 페이지 (또는 대체 된 요소)의 요소를 확인해야합니다. 사용하지 않아야합니다. first/all -이 경우 find을 css : first-child/: first-of-type 등을 사용하여 쿼리에 사용하려는 경우 typ 여러 요소를 반환하고 그 중 하나를 선택하는 대신 요소를 고유하게 식별하는 일 (또는 동등한 XPath) 페이지에서 비동기 적으로 대체되는 요소의 값인 경우에는 걱정하지 않아도됩니다.

+0

토마스 감사합니다. 너 나를 다시 도왔다. –