【问题标题】:Devise/Omniauth test failing: No route matches {:controller=>"omniauth_callbacks", :action=>"passthru", :provider=>:facebook}设计/Omniauth 测试失败:没有路由匹配 {:controller=>"omniauth_callbacks", :action=>"passthru", :provider=>:facebook}
【发布时间】:2013-01-18 18:02:16
【问题描述】:

我在 rails 3.2.11 下使用 Devise 2.2.0 和 omniauth 1.1.1。

我在一个名为“HomepageController”的未经身份验证的(例如,没有“before_filter :authenticate_user!”)控制器上进行了一个名为“homepage”的操作的测试。这个控制器动作非常简单,除非用户登录,否则它会传递到它的视图,在这种情况下它会重定向到我们的“homebase”页面。这是控制器操作:

class HomepageController < ApplicationController
  def homepage
if current_user then
  redirect_to :homebase
end
  end
end

这是我的测试:

require 'test_helper'

class HomepageControllerTest < ActionController::TestCase
  def setup
    @user = users(:donley)
  end

  test "should get homepage when signed in" do
    sign_in @user
    get :homepage
    assert_redirected_to "/homebase"
  end

  test "should get homepage when not signed in" do
    get :homepage
    assert_response :success
  end

end

第二次测试失败并出现此错误:

No route matches {:controller=>"omniauth_callbacks", :action=>"passthru", :provider=>:facebook}

在视图中的这一行:

= link_to user_omniauth_authorize_path(:facebook) do

这是我的设计和omniauth路线:

  resources :oauth_clients

  match '/oauth/test_request',  :to => 'oauth#test_request',  :as => :test_request

  match '/oauth/token',         :to => 'oauth#token',         :as => :token

  match '/oauth/access_token',  :to => 'oauth#access_token',  :as => :access_token

  match '/oauth/request_token', :to => 'oauth#request_token', :as => :request_token

  match '/oauth/authorize',     :to => 'oauth#authorize',     :as => :authorize

  match '/oauth',               :to => 'oauth#index',         :as => :oauth

  devise_for :users, :controllers => {:omniauth_callbacks => "omniauth_callbacks"}

  devise_scope :user do
    get "sign_in", :to => "devise/sessions#new"
    get "sign_up", :to => "devise/registrations#new"
    match "sign_out", :to => "devise/sessions#destroy"
  end

这是来自rake routes 的路线,看起来像错误消息中提到的路线:

user_omniauth_authorize /users/auth/:provider(.:format) omniauth_callbacks#passthru {:provider=>/facebook|linkedin/}

真正疯狂的是,当在rails server 或我的生产环境中的 Heroku 上运行时,所有这些代码都能完美运行。它只是在测试中失败。

非常感谢您提供任何见解!

【问题讨论】:

  • 这不是您问题的答案,但是...您的主页逻辑不应使用这样的重定向。你应该使用设计的助手authenticated,像这样:excid3.com/blog/…
  • Ashitaka,这可能无法回答这个问题,但它可能会解决我的问题。谢谢!
  • 你解决过这个问题吗?我奇怪地遇到了完全相同的问题(rails s 工作得很好),而且我已经在使用authenticated :user 块,所以链接对我没有帮助。
  • 我很抱歉,但是,不。我最终删除了测试用例。代码是如此琐碎,我无法证明花更多时间修复测试是合理的。

标签: ruby-on-rails-3 devise routes omniauth testunit


【解决方案1】:

我今天遇到了同样的问题,发现我没有在测试环境中添加 Facebook 作为提供程序。这应该在 devise.rb 初始化程序中完成。我想这就是我运行测试时没有生成路由的原因。

#config/initializers/devise.rb
if Rails.env.test?
  config.omniauth :facebook, "APP_ID", "APP_SECRET"
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    • 2012-07-17
    • 2011-12-25
    相关资源
    最近更新 更多