ruby-on-rails - 使用 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
解决方案
由于您正在运行 Rails >= 5.1,因此您不需要 DatabaseCleaner(Rails 5.1+ 共享应用程序和测试之间的数据库连接,并使用事务将每个测试与其他测试隔离开来)。删除对数据库清理器的所有引用。然后将您的集成测试更改为系统测试,这是您应该为 Rails 5.1+ 中的 Capybara 测试编写的内容。然后,它将自动设置基本 Capybara 测试所需的所有 before 和 teardown 块。
我猜您的电子邮件测试失败了,因为放在电子邮件中的 url 不包括正在运行测试的端口号。切换到系统测试可能会解决此问题,如果没有,您可以指定Capybara.always_include_port = true
确保端口从电子邮件添加到 URL。
推荐阅读
- firebase - 如何从移动客户端(iOS 和 Android)为 Cloud Functions 上的 HTTPS 触发器发送 Firebase Auth Token ID?
- html - 如何在没有 wtforms 的情况下将 csrf 添加到烧瓶应用程序?
- vim - 终极 Vim/Tmux 窗口重命名脚本
- python - 多个数组的元素最大值(和最小值)
- node.js - 处理 Express 后删除 Multer 上传对象
- python - 无法使用 pip3.6 安装包(找不到pyconfig.h)
- node.js - NodeJS - TypeError [ERR_INVALID_ARG_TYPE]:“路径”参数必须是字符串类型。收到未定义
- apache-spark - Spark 提交不适用于 Protobuf 依赖项
- python - 我已经编写了一个代码来查找html 链接中的标签,并提取每个标签中的数字并进行总结。我正在获取第 17 行的回溯
- python - Keras 回归模型损失:nan。如何解决?