如何登录功能规格

时间:2018-01-30 17:20:50

标签: ruby-on-rails ruby rspec devise rspec-rails

我有一个使用@ 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的最佳做法。 提前谢谢。

3 个答案:

答案 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)