使用Rails系统规范仍然需要DatabaseCleaner吗?

时间:2018-03-12 23:45:25

标签: ruby-on-rails rspec ruby-on-rails-5 database-cleaner

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

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

我的经历不同:

  1. 我的Rspec功能测试在升级到Rails后全部通过 5.1。
  2. 我将'功能'规格重命名为'系统'规格。所有测试都通过了
  3. 我删除了Database Cleaner gem,并删除了rails_helper.rb中的所有引用。由于validates uniqueness错误,JS测试现在失败了。非JS测试通过。
  4. 我的测试非常简单。

    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是否在内部处理数据库事务,还是仍需要数据库清理程序?有没有人遇到这个,或者可以指出我的相关信息?

1 个答案:

答案 0 :(得分:16)

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

  1. 删除capybara-selenium gem和database_cleaner gem
  2. 添加selenium-webdriver gem
  3. 确保您使用的是Rails 5.1.5。早期版本的Rails 5.1在ActionDispatch :: SystemTesting :: Server中存在导致问题的缺陷(已修复here)。
  4. 在您的rails_helper文件中,设置config.use_transactional_fixtures = true
  5. 如果您使用Devise进行身份验证,请在rails_helper文件中设置config.include Devise::Test::IntegrationHelpers, type: :system
  6. 根据Noel Rappin的帖子设置basic_configure个文件。
  7. RSpec.feature替换为RSpec.describe
  8. 有关我如何管理交换机的详细信息,请参阅this commit。这是一个麻烦,但希望现在更容易5.1.5已经修复了ActionDispatch :: SystemTesting :: Server问题(我不得不在5.1.4中修补文件,但你现在不用了)。 / p>