📜  rails rspec 在每次测试后销毁数据 - Ruby (1)

📅  最后修改于: 2023-12-03 15:04:47.106000             🧑  作者: Mango

Rails RSpec 在每次测试后销毁数据

数据库数据在测试中不重置会导致测试的结果不准确。Rails RSpec 给我们提供了一种简单的方式,在每次测试后自动销毁数据库数据。本文将详细介绍实现的过程。

首先,我们需要在 rails_helper.rb 文件中配置数据库清理策略。在 Rails 5 中,数据库清理器已经作为默认支持加载到 Rails。

RSpec.configure do |config|
  # ...

  config.use_transactional_fixtures = true

  # ...
end

设置 use_transactional_fixturestrue 后,每个测试将被包含在一个事务中,测试完成后,事务将被回滚,数据库将被清空。

然而,在某些情况下,使用事务处理器可能会产生一些意想不到的副作用,例如测试异步任务。在这种情况下,我们需要一个更明显的方式来清理数据库。

对于这种情况,我们可以使用 database_cleaner。它提供了一种更可预测的方式来清除数据库。我们可以通过编写以下代码的方法使用它:

# Gemfile
group :development, :test do
  gem 'database_cleaner'
end

# spec/rails_helper.rb
RSpec.configure do |config|
  # ...

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

  # ...

  config.around(:each) do |example|
    DatabaseCleaner.cleaning do
      example.run
    end
  end
end

首先,我们需要将 database_cleaner 添加到 Gemfile 中。然后,在 rails_helper.rb 中配置 DatabaseCleanerDatabaseCleaner 默认情况下使用 :deletion 策略,这是集成测试中不建议使用的。我们在此处指定带有 :truncation:transaction 策略。

然后,我们使用 around 钩子来在每个测试运行时使用清理器进行清理。现在,每个测试都将在一个事务中运行,并且在执行结束时,该事务将被回滚,并且清理器将使用 :truncation 模式清理数据库,以便清理器可以正确发挥作用。

开发者在测试时,经常会忘记清理缓存和进程。在终端输入 rails tmp:clear 即可清除所有缓存和进程,确保测试可以以正确的方式运行。

结论

在 Rails RSpec 中每次测试后自动清理数据库对测试非常重要。使用 use_transactional_fixtures 策略或 database_cleaner 清理器代替。本文介绍了使用这两种方式的实现。在测试中,务必清理缓存和进程,确保测试可以以正确的方式运行。

参考资料

RSpec Rails 特性 #2: 事务清理器

Database Cleaners