Omniauth 测试错误,Devise/Rails/Rspec
Omniauth Testing Error, Devise/Rails/Rspec
感谢任何意见。
这是我得到的确切错误。我不明白为什么。
No route matches {:action=>"users/auth/:facebook", :controller=>"omniauth_callbacks"} missing required keys: [:action]
Omniauth 控制器
def facebook
auth = env["omniauth.auth"]
@user = User.connect_to_facebook(request.env["omniauth.auth"],current_user)
if @user.persisted?
flash[:notice] = I18n.t "devise.omniauth_callbacks.success"
sign_in_and_redirect @user, :event => :authentication
else
session["devise.facebook_uid"] = request.env["omniauth.auth"]
redirect_to new_user_registration_url
end
end
用户模型
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,:omniauthable
has_many :games
has_many :comments, dependent: :destroy
def self.connect_to_facebook(auth, signed_in_resource=nil)
user = User.where(:provider => auth.provider, :uid => auth.uid).first
if user
return user
else
registered_user = User.where(:email => auth.info.email).first
if registered_user
return registered_user
else
user = User.create(username:auth.info.name,
provider:auth.provider,
uid:auth.uid,
email:auth.info.email,
password:Devise.friendly_token[0,20],)
end
end
end
config/initializers/devise.rb
require 'omniauth-facebook'
config.omniauth :facebook, ENV['FACEBOOK_PUBLIC'], ENV['FACEBOOK_SECRET'], scope: 'email', info_fields: 'email, name'
路线
devise_for :users, :controllers => { :omniauth_callbacks => "omniauth_callbacks" }
root to: 'home#index'
-spec/controllers/omniauth_callbacks_controller_spec.rb
require 'rails_helper'
RSpec.describe OmniauthCallbacksController, type: :controller do
def set_omniauth(opts = {})
default = {:provider => :facebook,
:uuid => "1234",
:facebook => {
:email => "foobar@example.com",
:gender => "Male",
:first_name => "foo",
:last_name => "bar"
}
}
credentials = default.merge(opts)
provider = credentials[:provider]
user_hash = credentials[provider]
OmniAuth.config.test_mode = true
OmniAuth.config.mock_auth[provider] = {
'uid' => credentials[:uuid],
"extra" => {
"user_hash" => {
"email" => user_hash[:email],
"first_name" => user_hash[:first_name],
"last_name" => user_hash[:last_name],
"gender" => user_hash[:gender]
}
}
}
end
def set_invalid_omniauth(opts = {})
credentials = { :provider => :facebook,
:invalid => :invalid_crendentials
}.merge(opts)
OmniAuth.config.test_mode = true
OmniAuth.config.mock_auth[credentials[:provider]] = credentials[:invalid]
end
describe "GET '/users/auth/facebook'" do
before(:each) do
set_omniauth
request.env["devise.mapping"] = Devise.mappings[:user]
request.env["omniauth.auth"] = OmniAuth.config.mock_auth[:facebook]
get "users/auth/facebook"
request.env["omniauth.auth"] = OmniAuth.config.mock_auth[:facebook]
end
it "should set user_id" do
expect(session[:user_id]).to eq(User.last.id)
end
end
end
提前感谢任何可以阐明一些想法或至少给我一些想法的人。
由于您正在编写控制器测试,因此您应该在 get
调用中提供控制器操作,而不是实际的 url,如下所示:
get :facebook
或者,您可以将测试更改为 request
spec,这样您将测试整个堆栈,并且它可以与 url.
一起使用
感谢任何意见。 这是我得到的确切错误。我不明白为什么。
No route matches {:action=>"users/auth/:facebook", :controller=>"omniauth_callbacks"} missing required keys: [:action]
Omniauth 控制器
def facebook auth = env["omniauth.auth"] @user = User.connect_to_facebook(request.env["omniauth.auth"],current_user) if @user.persisted? flash[:notice] = I18n.t "devise.omniauth_callbacks.success" sign_in_and_redirect @user, :event => :authentication else session["devise.facebook_uid"] = request.env["omniauth.auth"] redirect_to new_user_registration_url end end
用户模型
devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable,:omniauthable has_many :games has_many :comments, dependent: :destroy def self.connect_to_facebook(auth, signed_in_resource=nil) user = User.where(:provider => auth.provider, :uid => auth.uid).first if user return user else registered_user = User.where(:email => auth.info.email).first if registered_user return registered_user else user = User.create(username:auth.info.name, provider:auth.provider, uid:auth.uid, email:auth.info.email, password:Devise.friendly_token[0,20],) end end end
config/initializers/devise.rb
require 'omniauth-facebook' config.omniauth :facebook, ENV['FACEBOOK_PUBLIC'], ENV['FACEBOOK_SECRET'], scope: 'email', info_fields: 'email, name'
路线
devise_for :users, :controllers => { :omniauth_callbacks => "omniauth_callbacks" } root to: 'home#index'
-spec/controllers/omniauth_callbacks_controller_spec.rb
require 'rails_helper'
RSpec.describe OmniauthCallbacksController, type: :controller do
def set_omniauth(opts = {})
default = {:provider => :facebook,
:uuid => "1234",
:facebook => {
:email => "foobar@example.com",
:gender => "Male",
:first_name => "foo",
:last_name => "bar"
}
}
credentials = default.merge(opts)
provider = credentials[:provider]
user_hash = credentials[provider]
OmniAuth.config.test_mode = true
OmniAuth.config.mock_auth[provider] = {
'uid' => credentials[:uuid],
"extra" => {
"user_hash" => {
"email" => user_hash[:email],
"first_name" => user_hash[:first_name],
"last_name" => user_hash[:last_name],
"gender" => user_hash[:gender]
}
}
}
end
def set_invalid_omniauth(opts = {})
credentials = { :provider => :facebook,
:invalid => :invalid_crendentials
}.merge(opts)
OmniAuth.config.test_mode = true
OmniAuth.config.mock_auth[credentials[:provider]] = credentials[:invalid]
end
describe "GET '/users/auth/facebook'" do
before(:each) do
set_omniauth
request.env["devise.mapping"] = Devise.mappings[:user]
request.env["omniauth.auth"] = OmniAuth.config.mock_auth[:facebook]
get "users/auth/facebook"
request.env["omniauth.auth"] = OmniAuth.config.mock_auth[:facebook]
end
it "should set user_id" do
expect(session[:user_id]).to eq(User.last.id)
end
end
end
提前感谢任何可以阐明一些想法或至少给我一些想法的人。
由于您正在编写控制器测试,因此您应该在 get
调用中提供控制器操作,而不是实际的 url,如下所示:
get :facebook
或者,您可以将测试更改为 request
spec,这样您将测试整个堆栈,并且它可以与 url.