重置表ID并使用Rails上的Rspec重新创建测试数据库

时间:2016-11-10 02:38:04

标签: ruby-on-rails postgresql rspec

我有各种测试,在Rails中使用FactoryGirl创建模型

it "does something" do
  user = create(:user)
  ...
  expect(user.name).to eq("foo")
end

我注意到每次运行规范套件时,它都不会重置测试模式上的表ID(使用Postgres)。因此,在多次执行后,user可能会有id之类的2894

我使用Database Cleaner在后续运行之间清理我的数据库 - 见下文。

有没有办法直接在rspec运行之间重置表ID?我以前工作的一家公司用他们的应用做了这件事,但我不知道怎么做。

如果#1不是一个选项,是否可以在运行之间删除并重新创建测试数据库?

RSpec.configure do |config|
  config.before(:suite) do
    DatabaseCleaner.clean_with(:deletion)
  end

  config.before(:each) do
    DatabaseCleaner.strategy = :transaction
  end

  config.before(:each, js: true) do
    DatabaseCleaner.strategy = :deletion
  end

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

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

1 个答案:

答案 0 :(得分:1)

我也在使用DatabaseCleaner gem并且没有遇到同样的问题(虽然我使用的是mysql)。

不确定这是否对您的情况有帮助,但值得尝试我的配置:

RSpec.configure do |config|
  config.before(:suite) do
    DatabaseCleaner.clean_with(:truncation)
    Rails.application.load_seed
  end

  config.before(:each) do
    DatabaseCleaner.strategy = :transaction
  end

  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

我的rails_helper.rb

require 'support/database_cleaner'

RSpec.configure do |config|
  config.use_transactional_fixtures = false