在rspec特征测试中使用Devise

我写了以下rspec特性测试规范:

require "rails_helper" RSpec.describe "Team management", type: :feature do user_sign_in describe "User creates a new team" do ... expect(page).to have_link("#{team_name}") end end 

user_sign_in方法在我的rails_helper.rb定义:

 ENV['RAILS_ENV'] ||= 'test' require 'spec_helper' require File.expand_path('../../config/environment', __FILE__) require 'rspec/rails' require 'capybara/rails' ... module UserSignInHelpers def user_sign_in before(:each) do @request.env['devise.mapping'] = Devise.mappings[:user] @current_user = FactoryGirl.create(:user) @current_user.confirm sign_in :user, @current_user end end end RSpec.configure do |config| ... # The different available types are documented in the features, such as in # https://relishapp.com/rspec/rspec-rails/docs config.infer_spec_type_from_file_location! config.extend UserSignInHelpers, type: :controller config.extend UserSignInHelpers, type: :feature config.include Devise::TestHelpers, type: :controller config.include Devise::TestHelpers, type: :feature end 

user_sign_in方法适用于我的所有控制器规范,但是当我运行我的function规范时,它失败了:

 Team management User creates a new team example at ./spec/features/user_creates_a_new_team_spec.rb:19 (FAILED - 1) Failures: 1) Team management User creates a new team Failure/Error: Unable to find matching line from backtrace NoMethodError: undefined method `env' for nil:NilClass # /Users/xxxx/.rvm/gems/ruby-2.2.1/gems/devise-3.5.1/lib/devise/test_helpers.rb:24:in `setup_controller_for_warden' 

我不明白为什么这适用于控制器测试而不是function测试。 有什么我可以做的function在function测试中使用吗?

您正在尝试做的事情存在一个基本问题。 ( Devise Warden之上的工作) Warden是一个Rack中间件,但RSpec控制器规格甚至不包括Rack ,因为这些类型的规范并不意味着运行完整的应用程序堆栈,而只是运行控制器代码。

参考

Test with Capybara

我有一个简单的支持助手,允许我登录和注销用户:

 module Auth def create_user! @user = User.create(email: 'foo@bar.com', password: '11111111') end def sign_in_user! setup_devise_mapping! sign_in @user end def sign_out_user! setup_devise_mapping! sign_out @user end def setup_devise_mapping! @request.env["devise.mapping"] = Devise.mappings[:user] end def login_with_warden! login_as(@user, scope: :user) end def logout_with_warden! logout(:user) end def login_and_logout_with_devise sign_in_user! yield sign_out_user! end def login_and_logout_with_warden Warden.test_mode! login_with_warden! yield logout_with_warden! Warden.test_reset! end end 

在一个function:

 RSpec.describe "Team management", type: :feature do describe "User creates a new team" do login_and_logout_with_warden do # tests goes here end end end 

在控制器中:

 RSpec.describe "Team management", type: :controller do describe "User creates a new team" do login_and_logout_with_devise do # tests goes here end end end