【问题标题】:Devise Controller Test - ActionController::UrlGenerationError设计控制器测试 - ActionController::UrlGenerationError
【发布时间】:2015-01-06 16:59:45
【问题描述】:

我在我的 Rails 应用程序中通过 Devise 使用 OmniAuth。我正在尝试测试我的回调方法是否被正确调用并正常运行。我目前在运行规范时收到错误消息。

错误:

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 => 'fake@fake.com'
                                                          })

控制器:

#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',但我不知道解决这个问题的正确方法。

【问题讨论】:

  • 你解决了吗?我面临同样的问题,规范是正确的,适用于旧项目。也许只有最新版本的设计才会发生
  • 对不起@Fabio,我一直没弄明白!

标签: ruby-on-rails devise


【解决方案1】:

以防有人像我一样偶然发现这个问题的答案。 添加第二个 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]

【讨论】:

    【解决方案2】:

    我遇到了和你一样的错误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 模拟。现在它通过了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-29
      • 1970-01-01
      • 2015-01-13
      • 1970-01-01
      • 2016-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多