rspec不能使用设计用户身份验证 [英] rspec not working with devise user authentication
问题描述
我正在尝试使用RSpec来测试我的rails应用程序,它使用devise用户身份验证gem。
devise(3.4.1)
rails(4.1.7,4.1.6)
rspec(3.1.0)
rspec-core(3.1.7)
rspec-expectations(3.1.2)
rspec-mocks(3.1.3)
rspec-rails(3.1.0)
rspec-support(3.1.2)
根据devise和rspec的文档,我有一个spec / controller / feed_controller_spec.rb这样:
require'rails_helper'
/ pre>
RSpec.describe FeedController ,:type => :$ do
before(:each)do
devise_setup
end
它阻止未经身份验证的访问do
get:index
response.should redirect_to(new_user_session_path)
end
它允许验证访问do
user = User.create!(:foo =>'bar' ...)
sign_in user
get:index
expect(response).to be_success
end
end
在我的spec / support / controller_macros.rb文件中:
module ControllerMacros
def devise_setup
allow(request.env ['warden'])。接收(:authenticate!)。and_throw(:warden,{:scope =>:user})
allow(controller).to receive(:current_user).and_return(nil)
end
def sign_in(user)
if user.nil?
allow(request.env ['warden'])。接收(:authenticate!)。and_throw(:warden,{:scope =>:user})
allow(controller) (:current_user).and_return(nil)
else
允许(request.env ['warden'])接收(:authenticate!)and_return(user)
allow(controller) .to receive(:current_user).and_return(user)
end
end
end
最后但并非最不重要的我的spec / spec_helper.rb文件具有以下添加行(在使用rails生成rspec:init命令的文件的顶部):
require'devise'
RSpec.configure do | config |
config.include Devise :: TestHelpers,:type => :controller
config.extend ControllerMacros,:type => :控制器
end
当我在命令行上运行bundle exec rspec时,我收到以下错误:
/.../ spec / spec_helper.rb:6:在`block in< top(required)> ;':未初始化的常量ControllerMacros(NameError)
from /usr/local/lib/ruby/gems/2.1.0/gems/rspec-core-3.1.7/lib/rspec/core.rb:81:in 'configure'
from /home/vagrant/code/pulse/spec/spec_helper.rb:4:in`< top(required)>'
当我从spec_helper.rb文件中注释出ControlMacros行,它给出以下内容:
1)FeedController阻止未经身份验证的访问
失败/错误:devise_setup
NameError:
未定义局部变量或方法`devise_setup'for#< RSpec :: ExampleGroups :: FeedController:0xba5d20f4>
#./spec/controllers/feed_controller_spec.rb:9:in`($)$($)
2)FeedController允许身份验证访问
失败/错误:devise_setup
NameError:
未定义局部变量或方法`devise_setup'for#< RSpec :: ExampleGroups :: FeedController:0xba5c76a4>
#./spec/controllers/feed_controller_spec.rb:9:in'block(2 levels)in< top(required)>'
解决方案似乎需要
require'support / controller_macros'
。spec / support
子目录中的文件是自动加载但不是必需的。I am attempting to use RSpec to test my rails application which uses devise user authentication gem.
Here are a list of relevant gems already bundled:
devise (3.4.1) rails (4.1.7, 4.1.6) rspec (3.1.0) rspec-core (3.1.7) rspec-expectations (3.1.2) rspec-mocks (3.1.3) rspec-rails (3.1.0) rspec-support (3.1.2)
As per the documentation for devise and rspec I have a spec/controller/feed_controller_spec.rb like this:
require 'rails_helper' RSpec.describe FeedController, :type => :controller do before(:each) do devise_setup end it "blocks unauthenticated access" do get :index response.should redirect_to(new_user_session_path) end it "allows authenticated access" do user = User.create!(:foo => 'bar', ...) sign_in user get :index expect(response).to be_success end end
And in my spec/support/controller_macros.rb file:
module ControllerMacros def devise_setup allow(request.env['warden']).to receive(:authenticate!).and_throw(:warden, {:scope => :user}) allow(controller).to receive(:current_user).and_return(nil) end def sign_in(user) if user.nil? allow(request.env['warden']).to receive(:authenticate!).and_throw(:warden, {:scope => :user}) allow(controller).to receive(:current_user).and_return(nil) else allow(request.env['warden']).to receive(:authenticate!).and_return(user) allow(controller).to receive(:current_user).and_return(user) end end end
And last but not least my spec/spec_helper.rb file has the following added lines (at the top of the file that was created using rails generate rspec:init command):
require 'devise' RSpec.configure do |config| config.include Devise::TestHelpers, :type => :controller config.extend ControllerMacros, :type => :controller end
When I run bundle exec rspec on the command line I receive the following error:
/.../spec/spec_helper.rb:6:in `block in <top (required)>': uninitialized constant ControllerMacros (NameError) from /usr/local/lib/ruby/gems/2.1.0/gems/rspec-core-3.1.7/lib/rspec/core.rb:81:in `configure' from /home/vagrant/code/pulse/spec/spec_helper.rb:4:in `<top (required)>'
When I comment out the ControlMacros line from the spec_helper.rb file it gives the following:
1) FeedController blocks unauthenticated access Failure/Error: devise_setup NameError: undefined local variable or method `devise_setup' for #<RSpec::ExampleGroups::FeedController:0xba5d20f4> # ./spec/controllers/feed_controller_spec.rb:9:in `block (2 levels) in <top (required)>' 2) FeedController allows authenticated access Failure/Error: devise_setup NameError: undefined local variable or method `devise_setup' for #<RSpec::ExampleGroups::FeedController:0xba5c76a4> # ./spec/controllers/feed_controller_spec.rb:9:in `block (2 levels) in <top (required)>'
解决方案Seems like you need to
require 'support/controller_macros'
. Files in thespec/support
subdirectory are auto-loaded but not required.这篇关于rspec不能使用设计用户身份验证的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!