2017-11-01 15 views
0

경로를 방문하여 해당 페이지에서 새 대화를 만드는 rspec 테스트를 실행 중입니다. 그러나, 나는 분명히 visit conversations_path을 명시 했음에도 불구하고 왜 내가 아래에 오류가 발생하는지 이해할 수 없다. 오류 메시지에 기록 된 link_to 문은 내 루트 경로에서 발견됩니다.Rspec + Capybara 웹킷 : 테스트에 명시된 경로로 연결되지 않음 대신 루트 경로 구문이 감지 됨

루트 경로에서 link_to 코드를 제거하면 테스트가 통과됩니다.

conversation_spec.rb

describe "Conversation" do 

    let!(:user) { FactoryGirl.create(:user) } 
    let!(:other_user) { FactoryGirl.create(:friend) } 

    before do 
     login_as(user, :scope => :user) 
    end 

    describe 'index' do 

     before do 
      visit conversations_path 
     end 

     it 'can be reached successfully' do 
      expect(page.status_code).to eq(200) 
     end 

     it "create a new conversation", **js: true** do 
      visit conversations_path 
      expect(current_path).to eq(conversations_path) 
      click_on "Compose" 
      expect(page).to have_css('.new_message_head') 

     end 

    end 

실패 : featured_article이 전무이기 때문에 당신이 테스트에 대한 기사를 작성하지 않았기 때문에

1) Conversation index create a new conversation 
    Failure/Error: <h4><%= link_to featured_article.title, article_path(featured_article) %></h4> 

    ActionView::Template::Error: 
     undefined method `title' for nil:NilClass 

답변

0

같이 특정 오류, 가능성이 높습니다 . 대화가 아닌 루트 경로로가는 이유는 대화 컨트롤러 및/또는 test.log의 관련 부분을 보지 않고는 확실히 말할 수 없습니다. 그러나, 나는 무슨 일이 일어나고 있는지 2 가지 추측을 가지고있다.

  1. 대화는 경로는 보여 알고 그래서 존재하는 기사를 필요로하고, 당신이 방문을 호출하고

  2. 을 뿌리 리디렉션 그래서 당신은 두 번 테스트 데이터의 어떤을 생성하지 않습니다 행을 확인하지 않고 완료했습니다. 당신의 블록 전에 테스트

    login_as (: 범위 => : 사용자, 사용자)로 귀결로 방문 conversations_path 방문 conversations_path ... visit 이후

이 기다릴 보장되지는 돌아 오기 전에 완료해야 할 행동 (운전자는 최선을 다하지만 항상 가능하지는 않음)은 첫 번째 방문이 돌아 오기 전에 두 번째 방문 요청이 발생할 가능성이 있습니다. 당신이 사용하고있는 login_as이 devise/warden 테스트 모드 버전이라고 가정하면 다음 요청시 (그리고 다음 요청 만) 로그인 한 사용자를 설정하기 위해 미들웨어를 설정하여 작동합니다. 그런 다음 사용자가 해당 요청을 초과하여 로그인 한 상태로 응답을 반환하는 세션 쿠키를 설정합니다. 첫 번째 visit의 응답이 수신되고 처리되기 전에 두 번째 visit이 발생하면 세션 쿠키가 두 번째 요청에 설정되지 않으므로 사용자가 실제로 로그인하지 않으므로 루트 경로로 리디렉션됩니다.

test.log 정확히 파악 그것이 원인이되는합니다 별도의 메모에서

(또는 여분의 visit을 제거하려고) :이되어 일반적으로 나쁜 냄새 대신에 초점을 맞추어야 기능 테스트에서 응답 코드를 테스트 할 사용자가 페이지에서 볼 수있는 내용. 또한 일치자를 current_path과 함께 사용하면 안됩니다. JS 가능 드라이버 및 동적 페이지를 사용할 때 불안정한 테스트가 발생할 수 있기 때문입니다. 대신에 제공된 카피 바라를 사용해야합니다 expect(page).to have_current_path(conversations_path)