【问题标题】:rails test database won't wiperails test 数据库不会擦除
【发布时间】:2011-06-19 15:13:30
【问题描述】:

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

如果有任何进一步的信息可以让我更容易回答我的问题,请告诉我。

谢谢!
特里斯坦

【问题讨论】:

  • 我相信数据在您运行测试之前被清除,而不是之后。
  • 嘿,凸轮。抱歉,这可能是正确的,但现在两者都没有发生。

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


【解决方案1】:

安装 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

【讨论】:

  • 嘿,谢谢鲍比。默认情况下,每次运行 rspec 时测试数据库不应该开始为空吗?
  • 嘿 Tristan,应该是这样,但是当数据在测试之间徘徊时,会有一些奇怪的情况。我也相信如果您使用rake 来调用您的规范,它将在您的规范之前运行db:test:prepare
【解决方案2】:

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

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

【讨论】:

  • 嗨迪帕克。我已经在我的 spec_helper 文件中设置了该设置,并且我的 rspec 脚本是“需要”的 spec_helper。
  • 我在 rspec 2.8.0 中得到 undefined method 'use_transactional_examples='。这个方法有新名字吗?
  • 是的。现在是use_transactional_fixtures
【解决方案3】:

我刚刚提出的另一种可能性是使用了错误的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 除外)。

【讨论】:

    【解决方案4】:

    您不需要任何额外的 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
    

    【讨论】:

    • 这在 Rails 5.1.6 中对我有用,但我必须将它放在我的 rails_helper.rb 文件中,而不是 spec_helper。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    相关资源
    最近更新 更多