首页 > 解决方案 > 使用 Minitest、Capybara、Factorybot 和 Database Cleaner 时如何设置 test_helper.rb

问题描述

我已经看到很多关于如何使用 Rspec 设置 Capybara、Database Cleaner 和 Factorybot 的示例但没有一个使用 Rails 开箱即用的 Minitest 设置。

当我作为一个整体运行我的测试套件时,我遇到了Capybara::ElementNotFound错误,但是所有失败的测试在单独运行时都通过了。

所以,这让我相信我需要使用database_cleaner,但我无法弄清楚让测试套件通过的设置。test_helper.rb如果我想使用 Minitest、Capybara、Factorybot 和 Database Cleaner,我应该是什么样子?

这是我目前的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

如果测试单独通过,Capybara::ElementNotFound:我在运行时导致错误的设置有什么问题?rails test

标签: ruby-on-railscapybarafactory-botminitestdatabase-cleaner

解决方案


由于您正在运行 Rails >= 5.1,因此您不需要 DatabaseCleaner(Rails 5.1+ 共享应用程序和测试之间的数据库连接,并使用事务将每个测试与其他测试隔离开来)。删除对数据库清理器的所有引用。然后将您的集成测试更改为系统测试,这是您应该为 Rails 5.1+ 中的 Capybara 测试编写的内容。然后,它将自动设置基本 Capybara 测试所需的所有 before 和 teardown 块。

我猜您的电子邮件测试失败了,因为放在电子邮件中的 url 不包括正在运行测试的端口号。切换到系统测试可能会解决此问题,如果没有,您可以指定Capybara.always_include_port = true确保端口从电子邮件添加到 URL。


推荐阅读