How to do proper database testing (TDD) on Rails 3 using MongoDB and Mongoid How to do proper database testing (TDD) on Rails 3 using MongoDB and Mongoid mongodb mongodb

How to do proper database testing (TDD) on Rails 3 using MongoDB and Mongoid


Ok thanks to Kyle who pointed me in the right direction, I found out how to make it work.

So basically the trick is to drop all your collections in mongodb for each test case that you will run. This is a bit radical, but it works. But keep in mind that you won't retain any data at all in you test db.

Finally I found that link: http://adventuresincoding.com/2010/07/how-to-configure-cucumber-and-rspec-to-work-with-mongoid

And basically what you need to do is simple:

add a block in you spec_helper.rb:

RSpec.configure do |config|# blabla other confs  config.before :each do    Mongoid.master.collections.select {|c| c.name !~ /system/ }.each(&:drop)  end# blabla other confsend

For Mongoid 3:

 Mongoid.default_session.collections.select {|c| c.name !~ /system/ }.each(&:drop

This effectively kills all the collection within the db allowing you to run your tests fresh every time.

Alex


Another way is to use database_cleaner. It supports multiple ORMs, so I think you could do something like this:

# spec/support/database_cleaner.rbRSpec.configure do |config|  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  endend


There's no way to make MongoDB non-persistent. You simply have to delete data before or after each test. There's some documentation on that here:

http://www.mongodb.org/display/DOCS/Rails+-+Getting+Started#Rails-GettingStarted-Testing