数据库清理程序:清除vs截断

Jsh*_*523 3 rspec ruby-on-rails capybara database-cleaner

以下有什么区别?

  • DatabaseCleaner.clean_with(:截断)
  • DatabaseCleaner.clean

我想弄清楚的是使用数据库清理程序清理我的测试中的before(:all)钩子(性能明智)的最佳方法是什么.我之前的(:all)钩子只是创建了大量的工厂并在它们之间创建了一些关联.目前,我只是将它们全部加载到之前(:每个),不必担心之后的清理.

我目前的策略如下:

RSpec.configure do |config|
  config.use_transactional_fixtures = false

  config.before(:suite) do
    DatabaseCleaner.clean_with(:truncation)
  end

  config.before(:each) do |example|
    DatabaseCleaner.strategy = example.metadata[:js] ? :truncation : :transaction
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end
Run Code Online (Sandbox Code Playgroud)

所以除了我之前的问题,我的追求(:all)应该是什么样的?

Ale*_*ein 5

以下有什么区别?

  • DatabaseCleaner.clean_with(:截断)
  • DatabaseCleaner.clean

差别非常简单:在第一种情况下,您要告诉DatabaseCleaner现在使用truncation策略清理数据库,在第二种情况下,DatabaseCleaner将使用当前配置的策略清理数据库.

我认为你的设置已经非常好了.由于在before(:all)钩子中创建大量工厂(如你所说)是非常罕见的,你只需要添加到特定的测试after(:all)钩子以使db恢复到稳定状态.

使用事务清理不起作用,因为事务中before(:all) 没有包装.你有两个选择:

  1. after(:all) { DatabaseCleaner.with(:truncation) }

  2. after(:all) { DatabaseCleaner.with(:deletion) }

为了在这两者之间做出选择,正如文档明确指出的那样,你必须衡量和选择最适合你的东西,或者只要选择一些无关紧要的东西.