【问题标题】:Database Cleaner: Clean vs truncation数据库清理器:清理与截断
【发布时间】:2015-09-19 15:26:17
【问题描述】:

以下有什么区别?

  • DatabaseCleaner.clean_with(:truncation)
  • DatabaseCleaner.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) 应该是什么样子的?

【问题讨论】:

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


    【解决方案1】:

    以下有什么区别?

    • DatabaseCleaner.clean_with(:truncation)
    • DatabaseCleaner.clean

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

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

    无法使用事务清理,因为before(:all) is not wrapped 在事务中。 您在这里有 2 个选项:

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

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

    为了在这两者之间进行选择,作为documentation clearly states,你必须衡量并选择对你来说最快的,或者如果不重要就选择一些。

    【讨论】:

    • 所以对于我的策略,我的 after(:each) 中的 DatabaseCleaner.clean 是否清理了我的 before(:each) 中设置的策略?
    • 非常感谢,这正是我想要弄清楚的
    猜你喜欢
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    相关资源
    最近更新 更多