【问题标题】:How to set up test_helper.rb when using Minitest, Capybara, Factorybot, and Database Cleaner使用 Minitest、Capybara、Factorybot 和 Database Cleaner 时如何设置 test_helper.rb
【发布时间】: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_portapp_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_portapp_host ,但我仍然遇到同样的失败。无论我使用rails test 还是bundle exec guard 运行套件,测试都会失败,并且一切都是孤立地通过的。
  • 也许改用 chrome 驱动进行系统测试。使用 byebug 中断测试。然后,您可以从控制台检查数据库、dom 和测试 capybara 命令... HTH
  • 实际上最终不得不这样做。谢谢安迪。如果您想发表您的评论作为答案,我很乐意接受。

标签: ruby-on-rails capybara factory-bot minitest database-cleaner


【解决方案1】:

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

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

【讨论】:

  • 您能否说明将Capybara.always_include_port = true 配置放在何处?我已经在 test_helper.rbconfig/environments/test.rb 内尝试过,但没有任何运气......
猜你喜欢
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-14
  • 1970-01-01
  • 2012-05-21
相关资源
最近更新 更多