用selenium作为webdriver的Rails集成测试 – 不能sign_in

你好
我有一个非常简单的集成测试

require 'integration_test_helper' Capybara.current_driver = :rack_test class AdminSignsInTest < ActionDispatch::IntegrationTest test 'can sign in' do email = 'bob@example.com' password = 'secret_password' Admin.create email: email, password: password visit new_admin_session_path fill_in 'admin_email', with: email fill_in 'admin_password', with: password click_button I18n.t('devise.views.sign_in') assert_equal I18n.t('devise.sessions.signed_in'), find('p.notice').text end end 

当我将rack_test驱动程序设置为rack_test测试通行证时,但当我将其设置为selenium ,它会因“电子邮件或密码无效”而失败。 在登录页面上(我正在使用Devise)。 我究竟做错了什么?

当我将Capybara驱动程序设置为rack_test测试通行证时,但当我将其设置为selenium时,它会因“电子邮件或密码无效”而失败。 在登录页面上(我正在使用Devise)。 我究竟做错了什么?

你必须检查use_transactional_fixtures 。 使用事务性装置时,因为Selenium(或任何外部驱动程序,不是Rack::Test )无法访问已写入数据库的信息。 (因为交易尚未“承诺”)

您可以使用以下内容在test_helper.rb解决此问题:

 class ActionDispatch::IntegrationTest self.use_transactional_fixtures = false end 

您可能希望同时查看类似数据库清理器的内容 ,因为没有事务夹具,您的数据库将变得不整洁。

来自http://opinionatedprogrammer.com/2011/02/capybara-and-selenium-with-rspec-and-rails-3/ :

您还需要DatabaseCleaner,因为事务夹具不能与Selenium一起使用。 将database_cleaner gem添加到Gemfile的:test组,并将以下代码放入spec / support / database_cleaner.rb:

 DatabaseCleaner.strategy = :truncation RSpec.configure do |config| config.use_transactional_fixtures = false config.before :each do DatabaseCleaner.start end config.after :each do DatabaseCleaner.clean end end 

我发现mattwinder的答案有效,但我也不得不评论出这条线

config.use_transactional_fixtures = true

在spec / spec_helper.rb中也是如此。 只是在spec / support / database_cleaner.rb中覆盖它不足以使登录与Selenium一起使用。