从sqlite切换到PostgreSQL后,每次测试后,DB Cleaner都没有清理数据库

时间:2013-07-18 13:59:39

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

当我使用sqlite时,此配置工作正常:

  config.before(:suite) do
    DatabaseCleaner.strategy = :truncation
  end
  config.before(:each) do
    controller.stub(:should_navigate_user?).and_return(false) rescue ""
    DatabaseCleaner.start
  end
  config.after(:each) do
    DatabaseCleaner.clean
  end

当我切换到PostgreSQL时,当测试依赖于数据库中的条目数时,我开始收到错误。我在测试期间查看了数据库,但从未清理过数据库。

如果我切换到以下配置:

  config.before(:suite) do
    DatabaseCleaner.strategy = :truncation
  end
  config.before(:each) do
    DatabaseCleaner.clean
    controller.stub(:should_navigate_user?).and_return(false) rescue ""
    DatabaseCleaner.start
  end
  config.after(:each) do
    DatabaseCleaner.clean
  end

我的所有测试都通过了,但在方法测试之后,我必须在之前调用干净?

我不应该在每次测试之前和之后清理数据库 - 对吗?我觉得我在某处误解了某些东西。我没理解什么。

2 个答案:

答案 0 :(得分:3)

我正在使用postgres与数据库清理器。它现在运作良好,但我记得起初遇到麻烦。我在下面粘贴了我的配置。您可以将其粘贴到spec_helper.rb或其他文件中,例如/support/database_cleaner.rb

RSpec.configure do |config|

  config.before(:suite) do
    DatabaseCleaner.clean_with(:truncation)
  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

还要确保在spec_helper中关闭事务处理夹具:

config.use_transactional_fixtures = false

答案 1 :(得分:1)

您在非持久模式下使用了sqlite。 PostgreSQL没有这样的选项,总是持久的。使用drop database / create database来完全清理它。