DatabaseCleaner + RSpec: какая правильная конфигурация?
Я включил database_cleaner
gem в мое приложение rails. Последовал пример, приведенный в репозитории git и включил следующий код в spec_helper
:
Подход 1
config.before(:suite) do
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.clean_with(:truncation)
end
config.around(:each) do |example|
DatabaseCleaner.cleaning do
example.run
end
end
Когда я запускаю rspec
, я получаю ошибку как NoMethodError:undefined method 'cleaning' for DatabaseCleaner:Module
.
Итак, я сделал некоторые исследования и обнаружил, что я мог заменить блок config.around
выше примерно следующим образом:
Подход 2
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
ИЛИ
Подход 3
config.around(:each) do |example|
DatabaseCleaner.start
example.run
DatabaseCleaner.clean
end
Оба подхода 2 и 3 работают хорошо.
Я также просмотрел репозиторий git database_cleaner и обнаружил, что метод cleaning
действительно существует и со следующим кодом:
def cleaning(&block)
start
yield
clean
end
который точно такой же, как и в примере 3. Если он существует, то почему он недоступен? Я что-то пропустил. Любая настройка?
Или подходит подход 2 или 3?
Ответы
Ответ 1
Наконец нашел ответ,
database_cleaner
gem добавила метод cleaning
только на прошлой неделе, а также обновила документацию для нее. НО это изменение недоступно в последней версии gem версии 1.2.0, которую я получил от rubygems.org. Approach 1
отлично работает, когда я источник драгоценного камня от github
, как показано ниже:
gem 'database_cleaner', git: '[email protected]:DatabaseCleaner/database_cleaner.git'
Ответ 2
Вы можете использовать подход в документации, если вы потянете драгоценный камень от Github
gem 'database_cleaner', git: '[email protected]:bmabey/database_cleaner.git'
Ответ 3
Если у вас есть эта же проблема с помощью mongoid, вы можете добавить это в Gemfile, изменить версию и подобрать пакет.
gem 'database_cleaner', '~> 1.4.1'
Затем создайте папку поддержки в
spec/support/database_cleaner.rb
Требовать database_cleaner.rb в файле spec_helper, я использую gem 'require_all'
следующим образом:
# spec/spec_helper.rb
require 'require_all'
require_rel 'support'
Добавьте следующие очистители в базу данных_cleaner.rb
RSpec.configure do |config|
# Cleanup the DB in between test runs
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
Ваши тесты должны теперь правильно разорваться.