Как правильно тестировать базу данных (TDD) на Rails 3, используя MongoDB и Mongoid - PullRequest
19 голосов
/ 14 января 2011

Как можно написать правильное модульное тестирование (и интеграционное тестирование) с использованием MongoDB через Mongoid on Rails?

Я спрашиваю, потому что в противоположность использованию, скажем, 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 => /^user@example.com/i)
  cleanup.destroy unless cleanup.nil?
end

Есть идеи, как сделать MongoDB непостоянным во время тестирования? (Я даже не могу запустить консоль в режиме песочницы, потому что для использования Mongoid мне пришлось отключить активную запись).

Ответы [ 5 ]

12 голосов
/ 15 января 2011

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

Таким образом, в основном хитрость заключается в том, чтобы отбрасывать все ваши коллекции в mongodb для каждого тестового случая, который вы будете запускать. Это немного радикально, но это работает. Но имейте в виду, что вы не будете хранить никаких данных в своей тестовой базе данных.

Наконец я нашел эту ссылку: 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

Это эффективно убивает всю коллекцию в БД, позволяя вам каждый раз запускать новые тесты.

Alex

5 голосов
/ 25 августа 2012

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

Нет способа сделать MongoDB непостоянным. Вы просто должны удалить данные до или после каждого теста. Здесь есть некоторая документация по этому вопросу:

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

2 голосов
/ 10 июля 2015

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

В spec_helper.rb, ниже RSpec.configure do |config| Я поставил:

config.before :each do
   Mongoid.purge!
end

Ссылка.

2 голосов
/ 30 января 2013

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

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