Подтвердить что ты не робот

Как выполнить правильное тестирование базы данных (TDD) на Rails 3 с помощью MongoDB и Mongoid

Как было бы написано надлежащее модульное тестирование (и интеграционное тестирование, если на то пошло) с использованием 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).

4b9b3361

Ответ 2

Хорошо благодаря Кайлу, который указал мне в правильном направлении, я узнал, как заставить его работать.

Таким образом, в основном трюк заключается в том, чтобы отбросить все ваши коллекции в 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, позволяя вам каждый раз запускать ваши тесты.

Алекс

Ответ 3

Другой способ - использовать 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

Ответ 4

Вот что я сделал (используя Test:: Unit и Mongoid 3)...

# test/test_helper.rb
setup {
  Mongoid.default_session.collections.select {|c| c.name !~ /system/ }.each(&:drop)
}

Ответ 5

Это работало для меня.

В spec_helper.rb, под RSpec.configure do |config| я поставлю:

config.before :each do
   Mongoid.purge!
end

Ссылка.