rails test database不会擦除

时间:2011-02-01 23:07:24

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

我正在运行rails 3.0.3并使用带有postgresql数据库的rspec-rails 2.4.1。每当我运行RSpec测试时,数据都会保留在最后。有没有人知道如何让rails或rspec在每次使用之间擦除测试环境的数据?

请告诉我是否有任何进一步的信息可以让我更轻松地回答我的问题。

谢谢!
特里斯坦

4 个答案:

答案 0 :(得分:10)

安装database_cleaner gem,然后将其添加到spec_helper.rb。

Spec::Runner.configure do |config|

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

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

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

end

答案 1 :(得分:5)

使用事务示例在每次测试运行后回滚数据

RSpec.configure do |config|
  config.use_transactional_examples = true
end

答案 2 :(得分:1)

为了在运行之间清理测试数据库,您不需要任何额外的gem。在spec_helper.rb文件中,按如下方式配置rspec:

RSpec.configure do |c|
  c.around(:each) do |example|
    ActiveRecord::Base.connection.transaction do
      example.run
      raise ActiveRecord::Rollback
    end
  end
end

答案 3 :(得分:0)

我刚刚完成的另一种可能性是使用了错误的before块。

我不小心将before块设置为all而不是each

before :all do
  user = FactoryGirl.create(:user)
  sign_in user
end

这导致user在整个rspec运行的数据库中停留,导致验证冲突。

相反,before应该是each,以便通过rspec运行保持一切清洁:

before :each do
  user = FactoryGirl.create(:user)
  sign_in user
end

如果您犯了这个错误,那么在事情恢复正常之前,您可能需要手动清理测试数据库。最简单的方法是截断每个表(除了schema_migrations)。