我有一个使用@ request.env和Devise登录用户的帮助方法:
def login_user(user)
@request.env["devise.mapping"] = Devise.mappings[:user]
sign_in user
end
我正在尝试编写我需要登录的功能规范,但是login_user失败了:
1) Search finds a manufacturer
Failure/Error: @request.env["devise.mapping"] = Devise.mappings[:user]
NoMethodError:
undefined method `env' for nil:NilClass
# ./spec/support/controller_macros.rb:3:in `login_user'
# ./spec/features/search_spec.rb:17:in `block (2 levels) in <top (required)>'
我该如何解决?我没有使用功能规格的经验,黄瓜我使用功能登录,我绝对不确定这是rspecs的最佳做法。 提前谢谢。
答案 0 :(得分:1)
您也可以使用Capybara连接测试用户。在我的rails_helper中,我有这个方法:
def create_user_and_log_in
create :user, email: 'user@test.com', password: 'password'
visit new_user_session_path
fill_in :user_email, with: 'user@test.com'
fill_in :user_password, with: 'password'
click_on 'Connexion'
end
然后,您可以在规范中调用此方法。
答案 1 :(得分:1)
我正在使用不同的库然后设计但它应该有效。这是非常简单的模拟:
allow_any_instance_of(ApplicationController).to receive(:current_user) { user }
你可以通过制作一个特殊的助手来使它变得更简单:
spec/support/feature_spec_helper.rb
module FeatureSpecHelper
def login(user)
allow_any_instance_of(ApplicationController).to receive(:current_user) { user }
end
end
然后在spec config(spec_helper或rails_helper)中随处丢弃
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
(...)
RSpec.configure do |config|
config.include FeatureSpecHelper, :type => :feature
(...)
接下来,您可以在功能规范login user
答案 2 :(得分:0)
在我的应用程序中的Capybara功能规格中,我们使用了Warden测试助手:
# spec/rails_helper.rb
RSpec.configure do |config|
config.include Warden::Test::Helpers
Warden.test_mode!
end
# in the feature spec
login_as(user, scope: :user)
另外,对于控制器规格:
allow(controller).to receive(:current_user).and_return(user)