如何登录功能规范
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)
我有一个使用@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)