是否还需要使用Rails系统规范的DatabaseCleaner?

从我所读到的有关Rails 5.1新系统规范的所有内容中,我的理解是Rails现在在内部处理数据库事务。

来自Rspec的博客 :“[之前]您的测试和您测试的代码无法共享数据库事务,因此您无法使用RSpec的内置机制来回滚数据库更改,而是需要像数据库更清洁的gem。通过系统测试,Rails团队已经做了艰苦的工作以确保不是这种情况,因此您可以安全地使用RSpec的机制,而无需额外的gem。“

我的经历不同:

  1. 升级到Rails 5.1后,我的Rspecfunction测试全部通过。
  2. 我将’function’规格重命名为’系统’规格。 所有测试都通过了
  3. 我删除了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是否在内部处理数据库事务,还是仍需要数据库清理程序? 有没有人遇到这个,或者可以指出我的相关信息?

您不需要DatabaseCleaner gem。 以下是您需要的步骤的快速摘要:

  1. 删除capybara-selenium gem和database_cleaner gem
  2. 添加selenium-webdriver gem
  3. 确保您使用的是Rails 5.1.5。 早期版本的Rails 5.1在ActionDispatch :: SystemTesting :: Server中存在导致问题的缺陷( 在此处修复)。
  4. 在rails_helper文件中,设置config.use_transactional_fixtures = true
  5. 如果您使用Devise进行身份validation,请在您的rails_helper文件中设置config.include Devise::Test::IntegrationHelpers, type: :system
  6. 根据Noel Rappin的这篇文章设置basic_configure文件。
  7. RSpec.feature替换RSpec.describe

有关如何管理交换机的更多详细信息,请参阅此提交 。 这是一个麻烦,但希望现在更容易5.1.5已经修复了ActionDispatch :: SystemTesting :: Server问题(我不得不在5.1.4中修补文件,但你现在不必)。