2016-12-17 8 views
1

OmniAuthコールバックが本番環境で正しく動作しているように見えますが、ログインリンクをテストする機能が正しいページに移動しても、現在のパスは更新されません。機能テスト中にOmniAuthコールバックがページの場所を更新しないのはなぜですか?

セットアップ:

  • 工夫4.2.0
  • OmniAuth 1.3.1
  • Railsの5.0.0.1
  • カピバラ2.10.2

レプリケーション:

でJSを持つフィーチャグループの例:true、テストにOmniAuthを入れるモード:私は視覚的にページを閲覧すると

OmniAuth.config.test_mode = true 
OmniAuth.config.mock_auth[:facebook] = auth_hash 

がテスト

context 'signing in' do 
    it 'should operate correctly' do 
     visit root_path 
     expect(page).to have_content(I18n.t 'home.index.title') 
     expect(page).to have_content(I18n.t 'home.index.text') 
     page.find('.google-login').click 
     wait_for_ajax 
     # Fails here with: 
     # expected "https://stackoverflow.com/users/auth/google_oauth2" to equal "/journal" 
     expect(page).to have_current_path journal_root_path 
    end 
    end 

を構築し、正しいページがレンダリングされています。何が起こっていますか?これはカピバラやセレンの問題ではないようです。ブラウザは正しく(間違った)パスをキャプチャします。

答えて

1

問題はTurbolinksの問題であることが判明しました。

Turbolinks 5がそのリンク上で動作していると、リダイレクトが妨害されるようです。これはおそらく、OmniAuth.config.test_mode = trueを設定するとOmniAuthがテストサーバー上の別のページにリダイレクトするように指示されますが、運用構成ではFacebookサーバーにリンクが送信されるためです。

テストシナリオでは、Turbolinksは同じサーバー上にありますが、プロダクションのTurbolinksではそのリンクを傍受しないため、インターセプトします。

解決策は、私のソーシャルメディアリンクタグをdata-turbolinks="false"属性で更新することでした。 From:

  <%- resource_class.omniauth_providers.each do |provider| %> 
       <%= link_to omniauth_authorize_path(resource_name, provider), class: "#{(provider_name provider).downcase}-login social-login-small" do %> 
        <i></i> <%= provider_name provider %> Login 
       <% end %> 
      <% end -%> 

へ:

  <%- resource_class.omniauth_providers.each do |provider| %> 
       <%= link_to omniauth_authorize_path(resource_name, provider), class: "#{(provider_name provider).downcase}-login social-login-small", data: {turbolinks: false} do %> 
        <i></i> <%= provider_name provider %> Login 
       <% end %> 
      <% end -%> 
+1

あなたにたくさんありがとうございました! –

関連する問題