Rails 系统规范还需要 DatabaseCleaner 吗?
Posted
技术标签:
【中文标题】Rails 系统规范还需要 DatabaseCleaner 吗?【英文标题】:Is DatabaseCleaner still necessary with Rails system specs? 【发布时间】:2018-08-21 02:47:20 【问题描述】:从我所读到的关于 Rails 5.1 新系统规范的所有内容中,我的理解是 Rails 现在在内部处理数据库事务。
来自Rspec's blog:“[以前] 你的测试和被测代码不能共享数据库事务,因此你不能使用 RSpec 的内置机制来回滚数据库更改,而是需要像数据库清理器这样的 gem。使用系统测试中,Rails 团队已经努力确保不会出现这种情况,因此您可以安全地使用 RSpec 的机制,而无需额外的 gem。”
我的经历不一样:
-
升级到 Rails 后,我的 Rspec 功能测试全部通过
5.1。
我将“功能”规范重命名为“系统”规范。所有测试都通过了。
我删除了Database Cleaner gem,并删除了
rails_helper.rb
中的所有引用。由于validates uniqueness
错误,JS 测试现在失败。非 JS 测试通过。
我的测试非常简单。
let(:subject) page
let(:user) create :user, name: "TestUser"
it "displays the user page", :js do
visit user_path(user)
it is_expected.to have_content "TestUser"
end
禁用数据库清理器和:js => true
我得到user named TestUser already exists
。使用:js => false
测试通过。
系统测试和 rspec 的现状如何? Rails 是否在内部处理数据库事务,还是仍需要 Database Cleaner?有没有人遇到过这个,或者可以指出我的相关信息?
【问题讨论】:
他们的措辞对我来说也很难理解......我将其解读为 - 使用 Rails 系统测试 - 即在 test/system 下 - 或至少继承自ActionDispatch::SystemTest
。我在这里写下了我的经历:dev.to/dstull/…
感谢@dstull,实际上您的文章已经成为一个有用的参考!我已成功切换到系统测试,一切正常。现在我正在尝试优化,并希望从我的设置中删除 Database Cleaner 依赖项。但不确定我是否理解错了,这是否仍然需要!
实际上是系统规格!我正在使用 rspec
【参考方案1】:
您不需要 DatabaseCleaner gem。以下是您需要的步骤的快速摘要:
-
删除
capybara-selenium
gem 和database_cleaner
gem
添加selenium-webdriver
gem
确保您使用的是 Rails 5.1.5 或更高版本。 Rails 5.1 的早期版本在 ActionDispatch::SystemTesting::Server 中存在导致问题的缺陷(已修复 here)。
在您的rails_helper
文件中,设置config.use_transactional_fixtures = true
如果您使用 Devise 进行身份验证,请在您的 rails_helper 文件中设置 config.include Devise::Test::IntegrationHelpers, type: :system
根据Noel Rappin 的这篇帖子设置basic_configure
文件。
将RSpec.feature
全部替换为RSpec.describe
。
请参阅this commit,了解有关我如何管理交换机的更多详细信息。这很麻烦,但现在 5.1.5 已经修复了 ActionDispatch::SystemTesting::Server 问题,但希望更容易(我不得不在 5.1.4 中修改文件,但你现在不必这样做)。
【讨论】:
这么愚蠢的问题,不敢相信我忽略了它!我认为我的问题的根源在于我没有放弃capybara-selenium
以支持selenium-webdriver
。无论如何,现在一切都按预期进行。感谢您让我朝着正确的方向前进!!以上是关于Rails 系统规范还需要 DatabaseCleaner 吗?的主要内容,如果未能解决你的问题,请参考以下文章
Rails 5.1 中是不是还需要`require jquery_ujs`?
devise 和 rspec-rails - 如何在请求类型规范(带有 type: :request 标记的规范)中登录用户?
如果你使用 Google Checkout,是不是还需要在 Rails 中使用 ActiveMerchant/Spree/some payment gateway?