2017-11-01 1 views
0

パスを訪れ、そのページで新しい会話を作成するrspecテストを実行しています。しかし、私は明確にvisit conversations_pathと明記したにもかかわらず、なぜ私は以下のエラーが発生しているのか理解できません。エラーメッセージに書かれたlink_to文は、私のルートパスにあります。Rspec + Capybara webkit:テストで指定されたパスには向かわず、ルートパスの構文が検出されました

ルートパスから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がnilであるので、あなたのテストのための任意の記事を作成していないので、

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. をrootにリダイレクトですので、あなたは二度テストデータ内の任意の作成されていません行を確認せずに完了しました。 visitは、そのために待つことが保証されていないので 訪問conversations_path 訪問conversations_path ...

あなたのブロックの前に、あなたのテストが

login_as(ユーザー:範囲=>ユーザー)に要約して(ドライバーは最善を尽くしますが、必ずしもそうとは限りません)、最初のものが戻る前に2回目の訪問要求が発生している可能性があります。あなたが使用しているlogin_asがdevise/wardenテストモードバージョンであると仮定すると、次のリクエスト(および次のリクエストのみ)でログインしたユーザーを設定するミドルウェアを設定することによって動作します。これにより、セッションCookieが設定され、ユーザーはその要求を超えてログインしたまま応答を返します。第1のvisitからの応答が受信されて処理される前に第2のvisitが発生した場合、第2の要求でセッションクッキーが設定されないため、ユーザーは実際にログインしないため、ルートパスにリダイレクトされます。別のノートで

test.logはそれが(または単に余分visitを削除してみてください)原因を正確に特定する必要があります

:それは代わりに集中しなければならない機能のテストで応答コードをテストするために、一般的に嫌なにおいですユーザーがそのページで見ることができるものについて。また、は、JS対応のドライバと動的ページを使用しているときに不安定なテストにつながる可能性がありますので、current_patheqマッチャを使用しないでください。代わりに、have_current_pathマッチャーを提供するカピバラを使用する必要があります。expect(page).to have_current_path(conversations_path)

関連する問題