Тест контроллера разработки — ActionController::UrlGenerationError

Я использую OmniAuth через Devise в своем приложении Rails. Я пытаюсь проверить, что мой метод обратного вызова вызывается правильно и работает правильно. В настоящее время я получаю сообщение об ошибке при запуске моей спецификации.

Ошибка:

Failure/Error: get user_omniauth_authorize_path(:facebook)
ActionController::UrlGenerationError:
    No route matches {:action=>"/users/auth/facebook", :controller=>"users/omniauth_callbacks"} missing required keys: [:action]

Моя спецификация:

#spec/controllers/users/omniauth_callbacks_controller_spec.rb
require 'rails_helper'

RSpec.describe Users::OmniauthCallbacksController, :type => :controller do
  context 'get facebook' do
    before do
      request.env["devise.mapping"] = Devise.mappings[:user] # If using Devise
      request.env["omniauth.auth"] = OmniAuth.config.mock_auth[:facebook]
    end
    it 'should create user, redirect to homepage, and create session' do
      get user_omniauth_authorize_path(:facebook)
      expect(response).to redirect_to(user_omniauth_callback_path)
    end
  end
end

Файл поддержки:

#spec/support/omniauth.rb
OmniAuth.config.test_mode = true
OmniAuth.config.mock_auth[:facebook] = OmniAuth::AuthHash.new({
                                                              :provider => 'facebook',
                                                              :uid => '123545',
                                                              :email => '[email protected]'
                                                          })

Контроллер:

#app/controllers/users/omniauth_callbacks_controller.rb
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def facebook
    @user = User.from_omniauth(request.env['omniauth.auth'])

    if @user.persisted?
      sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not activated
      set_flash_message(:notice, :success, :kind => 'Facebook') if is_navigational_format? #todo what is this doing
    else
      session['devise.facebook_data'] = request.env['omniauth.auth']
      redirect_to new_user_registration_url
    end
  end
end

Маршруты:

devise_for :users, :controllers => { :omniauth_callbacks => 'users/omniauth_callbacks' }

Я думаю, что проблема в том, как он маршрутизируется. Я думаю, что действие должно быть просто «facebook», а не «/users/auth/facebook», но я не знаю, как правильно это решить.


person Andre LeBlanc    schedule 06.01.2015    source источник
comment
Вы когда-нибудь решали это? Я столкнулся с той же проблемой, и спецификация верна и работает в старых проектах. Возможно, происходит только с новейшими версиями устройства.   -  person Fabio    schedule 11.03.2015
comment
Извини, @Fabio, я так и не понял!   -  person Andre LeBlanc    schedule 01.04.2015


Ответы (2)


На случай, если кто-то наткнется на это, ища ответы, как я. У меня возникла эта проблема при добавлении второй стратегии Omniauth. Оказывается, проблема заключалась в том, что я забыл включить стратегию в объявление моей модели.

например, я уже авторизовался с помощью Google

# app/models/user.rb
devise :rememberable, :trackable, :omniauthable, :omniauth_providers => [:google]

но потом захотелось добавить второго провайдера (например facebook). Я забыл добавить facebook в список провайдеров omniauth и поэтому получил эту ошибку, когда моя спецификация запустилась. Я исправил это, изменив на

# app/models/user.rb
devise :rememberable, :trackable, :omniauthable, :omniauth_providers => [:google,:facebook]
person ChrisJ    schedule 19.06.2016

У меня такая же ошибка missing required keys: [:action] как и у вас. После того, как я прочитал документ RSpec, я обнаружил, что аргумент get должен быть чем-то вроде :index (имя действия). Потому что я определил:

# app/controllers/users/omniauth_callbacks_controller.rb

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def facebook
    # ...
  end
end

Поэтому я изменил get user_omniauth_authorize_path(:facebook) на get :facebook и добавил несколько моков omniauth. Теперь это проходит!

person user3295962    schedule 04.01.2016