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-webdrivergem 确保您使用的是 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 吗?的主要内容,如果未能解决你的问题,请参考以下文章

rake 规范不使用 rails 环境

为啥 ERB 不在 Rails 视图规范中执行?

Rails 5.1 中是不是还需要`require jquery_ujs`?

devise 和 rspec-rails - 如何在请求类型规范(带有 type: :request 标记的规范)中登录用户?

如果你使用 Google Checkout,是不是还需要在 Rails 中使用 ActiveMerchant/Spree/some payment gateway?

运行规范命令时未初始化的常量 Spec::Rails (NameError)