【发布时间】:2019-08-06 17:59:21
【问题描述】:
我已经看到很多关于如何使用 Rspec 设置 Capybara、Database Cleaner 和 Factorybot 的示例,但没有使用 Rails 开箱即用的 Minitest 设置。
当我作为一个整体运行我的测试套件时,我遇到了Capybara::ElementNotFound 错误,但所有失败的测试在单独运行时都通过了。
因此,这让我相信我需要使用 database_cleaner,但我无法弄清楚让测试套件通过的设置。如果我想使用 Minitest、Capybara、Factorybot 和 Database Cleaner,我的 test_helper.rb 应该是什么样的?
这是我目前的test_helper.rb:
ENV['RAILS_ENV'] ||= 'test'
Minitest::Reporters.use!
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
require 'minitest/reporters'
require 'capybara/rails'
require 'capybara/minitest'
require 'database_cleaner'
DatabaseCleaner.strategy = :truncation
class ActiveSupport::TestCase
include FactoryBot::Syntax::Methods
end
class ActionDispatch::IntegrationTest
include Capybara::DSL
include Capybara::Minitest::Assertions # Make `assert_*` methods behave like Minitest assertions
Capybara.server = :puma
Capybara.server_port = 3001
Capybara.app_host = 'http://localhost:3001'
Capybara.register_driver :selenium do |app|
Capybara::Selenium::Driver.new(app, browser: :chrome)
end
Capybara.javascript_driver = :chrome
Capybara.configure do |config|
config.default_max_wait_time = 10 # seconds
config.default_driver = :selenium
end
def teardown
Capybara.reset_sessions!
Capybara.use_default_driver
DatabaseCleaner.clean
end
end
宝石文件:
group :test do
gem 'capybara'
gem 'webdrivers'
gem 'capybara-selenium'
gem 'capybara-email'
gem 'faker'
gem 'database_cleaner'
gem 'rails-controller-testing'
gem 'minitest'
gem 'minitest-reporters'
gem 'guard'
gem 'guard-minitest'
end
我在设置中调用 DatabaseCleaner.start 进行任何使用 Factorybot 的测试,如下所示:
require 'test_helper'
class AccountTenancyTest < ActionDispatch::IntegrationTest
setup do
DatabaseCleaner.start
@acme_widgets_owner = create(:acme_widgets_owner)
@generic_gadgets_owner = create(:generic_gadgets_owner)
end
test "Account owners can't access someone else's account" do
# test goes here
end
end
如果测试单独通过,我在运行 rails test 时导致 Capybara::ElementNotFound: 错误的设置有什么问题?
【问题讨论】:
-
您使用的是什么版本的 Rails?也不要在没有充分理由的情况下设置
server_port或app_host。 -
Rails 6.0.0.rc2。我设置 server_port 和 app_host 以在从 :webkit 作为我的 javascript 驱动程序切换到 :chrome 后进行密码重置测试。我的邮件测试在这一步失败
open_email(@user.email) current_email.click_link 'Change my password',然后当我在与开发不同的服务器端口上运行测试时它开始通过。我刚刚尝试从 test_helper.rb 中删除server_port和app_host,但我仍然遇到同样的失败。无论我使用rails test还是bundle exec guard运行套件,测试都会失败,并且一切都是孤立地通过的。 -
也许改用 chrome 驱动进行系统测试。使用 byebug 中断测试。然后,您可以从控制台检查数据库、dom 和测试 capybara 命令... HTH
-
实际上最终不得不这样做。谢谢安迪。如果您想发表您的评论作为答案,我很乐意接受。
标签: ruby-on-rails capybara factory-bot minitest database-cleaner