【发布时间】:2015-06-23 20:02:12
【问题描述】:
我目前在运行 PostgreSQL 的 Rails 项目中使用DatabaseCleaner,并将其设置如下。
RSpec.configure do |config|
config.before(:suite) do
DatabaseCleaner.clean_with(:truncation, { pre_count: true, reset_ids: true })
end
config.before(:each, js: true) do
DatabaseCleaner.strategy = :truncation
end
config.before(:each) do
DatabaseCleaner.strategy = :transaction
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
在我的一个 Rails 测试套件中,我打印了一个实例的 id。我认为它应该是相对较小的数字,因为 clean_with(:truncate) 假设清除 db 并在其上运行真空。但每次我运行测试时它都会增加。
测试通过了,不管它使用什么顺序。但是为什么clean_with(:truncation) 没有按应有的方式工作?
====== 编辑 ======
这在 RSpec 测试的范围内。我知道序列编号对性能没有影响,但是对每个 :suite 进行昂贵的清理 (:truncation) 并使用便宜且快速的清理 (:transaction) 会。所以我想了解为什么clean_with(:truncation) 在运行测试套件之前不会为我重置 id 以获得干净的数据库状态。
【问题讨论】:
-
@muistooshort 你是对的。我将编辑我的问题。
-
我不知道 rails,但
truncate本身不会重置 Postgres 中的任何序列。但是 Postgres 支持truncate .. restart identity。也许在 Rails 中这可以以某种方式配置 -
选项 reset_ids 假设确保序列重置。实际上。默认情况下,截断重置数据库清理器中的序列。我刚刚添加了该选项以清除自己。如果我做
DatabaseCleaner.strategy = :truncate,它会正确重置。但我想为每个使用事务来优化性能 -
如果你有一个关于你的身份的索引,它们是高还是低都没有关系......你不会因为数字低而获得任何性能提升......
-
@Lichtamberg 对。我了解索引编号与性能无关。但是使用交易策略可以。为每个测试用例运行截断比运行事务慢。这就是为什么我想对每个 :suite 执行截断
标签: ruby-on-rails ruby postgresql rspec-rails database-cleaner