How would go about writing proper unit testing (and integration testing for that matter) using MongoDB through Mongoid on Rails ?
I am asking, because to the opposite of
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 confs
end
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
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
Here's what I did (using Test::Unit and Mongoid 3)...
# test/test_helper.rb
setup {
Mongoid.default_session.collections.select {|c| c.name !~ /system/ }.each(&:drop)
}
Another way is to use database_cleaner. It supports multiple ORMs, so I think you could do something like this:
# spec/support/database_cleaner.rb
RSpec.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
end
end
This one worked for me.
In spec_helper.rb
, under RSpec.configure do |config|
I put:
config.before :each do
Mongoid.purge!
end
Reference.