如何登录功能规范

How to login in feature specs

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

您也可以使用 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

然后您可以在您的规范中调用此方法。

我当时使用的是不同的库,然后是 Devise,但它应该可以工作。这是非常简单的模拟:

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_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

在我的应用程序的 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)