如何在集成测试中编写用于签署用户的快捷方式?

在这个问题的讨论的启发下,我想为我的集成测试编写一个登录方法。 在我的test_helper.rb我甚至找到了这样一个方法,但它是在ActiveSupport::TestCase类中定义的,我的测试inheritance自ActionDispatch::IntegrationTest 。 所以我复制了方法并将它(在test_helper.rb )放入ActionDispatch::IntegrationTest类中。 但它不起作用,我的测试失败了这条消息:

 Capybara::ExpectationNotMet: expected "data:," to include "Study | Word Up" 

它实际上从未在浏览器中实际打开应用程序。

所以我的问题是,我可以在集成测试中使用这样的快捷方式,如果是的话,怎么样?

我正在使用带有has_secure_password的构建身份validation和Michael Hartl在他的Railstutorial中显示的机制。

这是我的test_helper.rb

 ENV['RAILS_ENV'] ||= 'test' require File.expand_path('../../config/environment', __FILE__) require 'rails/test_help' require 'minitest/rails' require 'minitest/rails/capybara' require 'capybara/rails' require 'capybara/poltergeist' class ActiveSupport::TestCase ActiveRecord::Migration.check_pending! fixtures :all # Logs in a test user. def log_in_as(user, options = {}) password = options[:password] || 'password' remember_me = options[:remember_me] || '1' if integration_test? post login_path, session: { email: user.email, password: password, remember_me: remember_me } else session[:user_id] = user.id end end private def integration_test? defined?(post_via_redirect) end end class ActionDispatch::IntegrationTest include Capybara::DSL def log_in_as(user, options = {}) password = options[:password] || 'password' remember_me = options[:remember_me] || '1' if integration_test? post login_path, session: { email: user.email, password: password, remember_me: remember_me } else session[:user_id] = user.id end end end class ActiveRecord::Base mattr_accessor :shared_connection @@shared_connection = nil def self.connection @@shared_connection || retrieve_connection end end ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection Capybara.register_driver :selenium_chrome do |app| Capybara::Selenium::Driver.new(app, :browser => :chrome) end Capybara.current_driver = :selenium_chrome Capybara.default_wait_time = 5 

测试本身看起来像这样:

 require 'test_helper' class StudyCapybaraTest < ActionDispatch::IntegrationTest def setup @user = users(:archer) @vocabs = @user.vocabs log_in_as @user # visit login_path # fill_in "session_email", with: @user.email # fill_in "session_password", with: 'password' # click_button "session_commit" end .... end 

您不能将#post方法与Capybara一起使用,因为它不会被路由到驱动程序,这就是浏览器无法打开的原因。 要在集成测试中快速登录,最简单的解决方案是在测试环境中安装后门中间件,如下所示 – https://robots.thoughtbot.com/faster-tests-sign-in-through-the-back-door这个例子是为了清除所以你必须改变

 @env[:clearance].sign_in(user) 

当用户密码被validation为有效时,你要做任何你正在做的事情,但除此之外它应该工作正常。 然后你实际上不需要login_as,你可以这样做

 visit page_being_tested_path(as: user.id) 

注意 – 您还应该有手动执行日志记录的测试以validation它是否有效,并且非常重要您只在测试环境中拥有该中间件