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

And*_*vey 25 rspec ruby-on-rails database-cleaner ruby-on-rails-5

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

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

我的经历不同:

  1. 升级到Rails 5.1后,我的Rspec功能测试全部通过.
  2. 我将'功能'规格重命名为'系统'规格.所有测试都通过了
  3. 我删除了Database Cleaner gem,并删除了所有引用rails_helper.rb.JS测试现在由于validates uniqueness错误而失败.非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
Run Code Online (Sandbox Code Playgroud)

数据库清理器禁用,:js => true我得到user named TestUser already exists.随着:js => false测试通过.

系统测试和rspec的当前情况如何?Rails是否在内部处理数据库事务,还是仍需要数据库清理程序?有没有人遇到这个,或者可以指向我相关信息?

mov*_*son 28

您不需要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文件中,设置 capybara-selenium
  5. 如果您使用Devise进行身份验证,请在rails_helper文件中进行设置 database_cleaner
  6. selenium-webdriver根据Noel Rappin的这篇文章设置一个文件.
  7. rails_helper全程替换config.use_transactional_fixtures = true.

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