您好
我有一个非常简单的集成测试
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
当我将Capybara驱动程序设置为rack_test
测试通行证时,但当我将其设置为selenium
时,它会因“电子邮件或密码无效”而失败。在登录页面上(我正在使用Devise)。我做错了什么?
答案 0 :(得分:36)
当我将Capybara驱动程序设置为rack_test测试通行证时,但当我将其设置为selenium时,它会因“电子邮件或密码无效”而失败。在登录页面上(我正在使用Devise)。我做错了什么?
您必须检查use_transactional_fixtures
。使用事务性装置时,因为Selenium(或任何外部驱动程序,不是Rack::Test
)无法访问已写入数据库的信息。 (因为交易尚未“承诺”)
您可以使用以下内容在test_helper.rb
内解决此问题:
class ActionDispatch::IntegrationTest
self.use_transactional_fixtures = false
end
您可能希望同时查看类似Database Cleaner的内容,如果没有事务性设备,您的数据库将变得不整洁。
答案 1 :(得分:9)
来自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
答案 2 :(得分:0)
我发现mattwinder的答案有效,但我也不得不注意掉这条线
config.use_transactional_fixtures = true
在spec / spec_helper.rb中也是如此。只是在spec / support / database_cleaner.rb中覆盖它不足以使登录与Selenium一起使用。