📅  最后修改于: 2023-12-03 15:04:47.106000             🧑  作者: Mango
数据库数据在测试中不重置会导致测试的结果不准确。Rails RSpec 给我们提供了一种简单的方式,在每次测试后自动销毁数据库数据。本文将详细介绍实现的过程。
首先,我们需要在 rails_helper.rb
文件中配置数据库清理策略。在 Rails 5 中,数据库清理器已经作为默认支持加载到 Rails。
RSpec.configure do |config|
# ...
config.use_transactional_fixtures = true
# ...
end
设置 use_transactional_fixtures
为 true
后,每个测试将被包含在一个事务中,测试完成后,事务将被回滚,数据库将被清空。
然而,在某些情况下,使用事务处理器可能会产生一些意想不到的副作用,例如测试异步任务。在这种情况下,我们需要一个更明显的方式来清理数据库。
对于这种情况,我们可以使用 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
中配置 DatabaseCleaner
。DatabaseCleaner
默认情况下使用 :deletion
策略,这是集成测试中不建议使用的。我们在此处指定带有 :truncation
的 :transaction
策略。
然后,我们使用 around
钩子来在每个测试运行时使用清理器进行清理。现在,每个测试都将在一个事务中运行,并且在执行结束时,该事务将被回滚,并且清理器将使用 :truncation
模式清理数据库,以便清理器可以正确发挥作用。
开发者在测试时,经常会忘记清理缓存和进程。在终端输入 rails tmp:clear
即可清除所有缓存和进程,确保测试可以以正确的方式运行。
在 Rails RSpec 中每次测试后自动清理数据库对测试非常重要。使用 use_transactional_fixtures
策略或 database_cleaner
清理器代替。本文介绍了使用这两种方式的实现。在测试中,务必清理缓存和进程,确保测试可以以正确的方式运行。