【问题标题】:Rails spec using Postgres test environment, test tables don't restart id increment?Rails 规范使用 Postgres 测试环境,测试表不重启 id 增量?
【发布时间】:2017-10-04 12:08:54
【问题描述】:

刚从sqlite 用于测试切换到pg。我注意到,虽然测试表清除得很好,但 ID 不会重新开始为 1。换句话说,给定测试:

describe "" do
  before do
    # some dummy is created
    Object.create()
    puts "count = #{Object.count}"
    puts "last object_id = #{Object.id}"
  end
  ...
end

如果您运行许多测试,您将获得以下输出:

count = 1
last object_id = 1
count = 1
last object_id = 2
count = 1
last object_id = 3
count = 1
last object_id = 4

而我觉得最好同时清除测试表并重新启动 ID,以便:

count = 1
last object_id = 1
count = 1
last object_id = 1
count = 1
last object_id = 1
count = 1
last object_id = 1

我认为这只是我的spec_helper 文件中需要的东西?作为参考,下面的当前帮助文件,我正在使用database_cleaner gem。谢谢!

RSpec.configure do |config|
  # Database cleaner set up below
  config.before(:each) do
    DatabaseCleaner.strategy = :transaction
  end

  # Clean up all jobs specs with truncation
  config.before(:each, js: true) do
    DatabaseCleaner.strategy = :truncation
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end
end

【问题讨论】:

  • 通常,对象的id与实际测试无关,因此不需要重新设置自增。
  • 您确定您正在使用截断策略运行测试吗?我希望您的测试标题中出现describe "", js:true 之类的内容,因此我怀疑您可能正在使用事务策略运行测试。您可以在测试运行时显示测试日志吗?在那里你应该清楚地看到它是进行事务ROLLBACK 还是截断。

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


【解决方案1】:

您的psql 版本可能低于8.4,这就是它不起作用的原因。
使用 psql --version 查找您的版本,并从数据库清理器源中查找您需要 8.4 或更高版本。

@restart_identity ||= db_version >=  80400 ? 'RESTART IDENTITY' : ''

我运行的是 9.6.2,运行良好。

> truncate users restart identity;
> insert into users (x) values (1);
> select * from users ;

#  id | x 
# ----+---
#   1 | 1

为了确保数据库清理器也能正常工作。

require 'rails/all'
require 'database_cleaner'
ActiveRecord::Base.establish_connection('postgres://localhost/test1')
class User < ActiveRecord::Base; end
User.count
# => 1
DatabaseCleaner.clean_with(:truncation, reset_ids: true)

它重置串行列。

$ psql -d test1
> insert into users (x) values (1);
> select * from users ;

#  id | x 
# ----+---
#   1 | 1

【讨论】:

  • 不...我今天刚安装,所以有相同的版本,会继续寻找
猜你喜欢
  • 2013-07-06
  • 1970-01-01
  • 2013-02-20
  • 1970-01-01
  • 2018-01-26
  • 1970-01-01
  • 2013-03-27
  • 2010-10-28
  • 1970-01-01
相关资源
最近更新 更多