Ответ 1
Невозможно сделать MongoDB непостоянным. Вам просто нужно удалить данные до или после каждого теста. Там есть документация:
http://www.mongodb.org/display/DOCS/Rails+-+Getting+Started#Rails-GettingStarted-Testing
Как было бы написано надлежащее модульное тестирование (и интеграционное тестирование, если на то пошло) с использованием MongoDB через Mongoid on Rails?
Я спрашиваю, потому что, наоборот, используя let say SQLite3, даже при выполнении тестов все, что я делаю, сохраняется. Поэтому на данный момент я пишу тест создания, а затем вручную удаляю все, что я делаю. Но это становится раздражающим и даже сложным для интеграционного тестирования.
Пример того, что я делаю:
before(:each) do
@user = User.create!(@attr)
end
after(:each) do
# MongoDB is not a transactional DB, so added objects (create) during tests can't be rollbacked
# checking for the existance of a similar object with exact :name and :email (regex make it case insensitive)
cleanup = User.where(:name => "Example User", :email => /^[email protected]/i)
cleanup.destroy unless cleanup.nil?
end
Любая идея, как сделать MongoDB не стойким во время тестирования? (Я даже не могу запустить консоль в режиме песочницы, потому что для использования Mongoid мне пришлось деактивировать Active Record).
Невозможно сделать MongoDB непостоянным. Вам просто нужно удалить данные до или после каждого теста. Там есть документация:
http://www.mongodb.org/display/DOCS/Rails+-+Getting+Started#Rails-GettingStarted-Testing
Хорошо благодаря Кайлу, который указал мне в правильном направлении, я узнал, как заставить его работать.
Таким образом, в основном трюк заключается в том, чтобы отбросить все ваши коллекции в mongodb для каждого тестового примера, который вы будете запускать. Это немного радикально, но это работает. Но имейте в виду, что вы вообще не будете хранить какие-либо данные в тестовом db.
Наконец, я нашел ссылку: http://adventuresincoding.com/2010/07/how-to-configure-cucumber-and-rspec-to-work-with-mongoid
И в основном то, что вам нужно сделать, просто:
добавьте блок в 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
Для Mongoid 3:
Mongoid.default_session.collections.select {|c| c.name !~ /system/ }.each(&:drop
Это эффективно убивает всю коллекцию в db, позволяя вам каждый раз запускать ваши тесты.
Алекс
Другой способ - использовать database_cleaner. Он поддерживает несколько ORM, поэтому я думаю, вы могли бы сделать что-то вроде этого:
# 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
Вот что я сделал (используя Test:: Unit и Mongoid 3)...
# test/test_helper.rb
setup {
Mongoid.default_session.collections.select {|c| c.name !~ /system/ }.each(&:drop)
}
Это работало для меня.
В spec_helper.rb
, под RSpec.configure do |config|
я поставлю:
config.before :each do
Mongoid.purge!
end