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

ber*_*kes 15 rspec mongoid ruby-on-rails-3

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

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

dec*_*lan 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
Run Code Online (Sandbox Code Playgroud)

或者,如果要清空集合但不想丢弃它(可能有索引或其他东西),请执行此操作

Mongoid::Sessions.default.collections.select {|c| c.name !~ /system/}.each {|c| c.find.remove_all}
Run Code Online (Sandbox Code Playgroud)


Bat*_*ins 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
Run Code Online (Sandbox Code Playgroud)

信用:名为Alex的用户将此作为类似问题的解决方案发布.

  • 如果你正在使用**Mongoid 3**,你将需要类似的东西:`Mongoid.default_session.collections.select {| c | c.name!〜/ system /} .each(&:drop)` (9认同)
  • 这完全是挑剔,实际上可能并不重要,但你的解决方案效率有点低.您将为select选择迭代所有集合,然后遍历每个集合中的子集.这只是迭代了一次集合:`Mongoid.default_session.collections.each {| coll | coll.drop除非/^system/.match(coll.name)}` (7认同)

Max*_*tov 16

如果您使用的是MongoID,则可以将Database CleanerTruncation策略一起使用.例如:

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
Run Code Online (Sandbox Code Playgroud)


msa*_*sa7 8

在Mongoid v2.0.2中

before(:each) do
    Mongoid.purge!
end
Run Code Online (Sandbox Code Playgroud)

Rdoc:Mongoid.purge!