3

以下有什么区别?

  • DatabaseCleaner.clean_with(:truncation)
  • 数据库清理器.clean

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

我目前的策略如下:

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

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

4

1 回答 1

5

以下有什么区别?

  • DatabaseCleaner.clean_with(:truncation)
  • 数据库清理器.clean

区别很简单:在第一种情况下,您告诉DatabaseCleaner现在使用truncation策略清理数据库,而在第二种情况下,DatabaseCleaner将使用当前配置的策略清理您的数据库。

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

使用事务进行清理是行不通的,因为before(:all) 它没有包含在事务中。您在这里有 2 个选项:

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

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

为了在这两者之间进行选择,正如文档中明确指出的那样,您必须测量并选择对您来说最快的,或者只选择一些无关紧要的。

于 2015-09-19T15:57:39.780 回答