在Rails 3上使用Rspec和MongoID清理或重置测试数据库

时间:2011-07-05 13:43:45

标签: ruby-on-rails-3 rspec mongoid

当我运行我的rspec测试时,许多因我的mongodb数据库中的陈旧数据而失败。 AFAIK用干净的数据库进行测试要好得多。

使用mysql,我可以运行rake db:test:prepare来清理数据库。如何在每次测试之前清理nd /或重新播种数据库?

6 个答案:

答案 0 :(得分:30)

Mongoid 3.0 ,其他任何一个答案都不适合我。我使用@Batkins答案修改如此

RSpec.configure do |config|

  # Clean/Reset Mongoid DB prior to running each test.
  config.before(:each) do
    Mongoid::Sessions.default.collections.select {|c| c.name !~ /system/ }.each(&:drop)
  end
end

或者,如果你想清空集合但又不想丢弃它(也许你有索引或其他东西),那就这样做

Mongoid::Sessions.default.collections.select {|c| c.name !~ /system/}.each {|c| c.find.remove_all}

答案 1 :(得分:18)

恕我直言,这是一个比安装宝石更好的解决方案,用于清理数据库的特定目的....你的spec_helper.rb中有3行:

RSpec.configure do |config|
  #Other config stuff goes here

  # Clean/Reset Mongoid DB prior to running the tests
  config.before :each do
    Mongoid.master.collections.select {|c| c.name !~ /system/ }.each(&:drop)
  end
end

信用:A user named Alex posted this as a solution for a similar question.

答案 2 :(得分:16)

如果您使用的是MongoID,则可以将Database Cleaner截断策略结合使用。 E.g:

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

  config.before :each do
    DatabaseCleaner.strategy = :truncation
    DatabaseCleaner.start
  end

  config.after do
    DatabaseCleaner.clean
  end
end

答案 3 :(得分:8)

在Mongoid v2.0.2中

before(:each) do
    Mongoid.purge!
end

Rdoc: Mongoid.purge!

答案 4 :(得分:3)

添加到gemfile:

gem 'database_cleaner', :github => 'bmabey/database_cleaner'

运行bundle install

将此添加到spec_helper:

config.before(:suite) do
  DatabaseCleaner[:mongoid].strategy = :truncation
  DatabaseCleaner[:mongoid].clean_with(:truncation)
end

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

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

完全归功于: http://blog.codelette.com/2013/07/07/make-rspec-clean-up-mongoid-records/

答案 5 :(得分:0)

例如,如果您使用多个MongoDB客户端,或者不使用默认客户端,则可以在mongoid.yml中创建一个新客户端,例如:“ actions”。

您需要指定连接名称。 例如供“操作”客户端使用:

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

config.before(:each) do
  DatabaseCleaner[:mongoid, { connection: :actions }].start
  DatabaseCleaner.start
end

config.after(:each) do
  DatabaseCleaner[:mongoid, { connection: :actions }].clean
  DatabaseCleaner.clean
end