Очистка тестовой базы данных между модульными и функциональными тестами в Rails (factory_girl)

Недавно я переключился с фикстур на factory_girl, чтобы протестировать свое приложение Ruby on Rails. Если я запустил rake test: units, чтобы запустить тесты в моем каталоге / units, все они будут работать отлично. То же самое верно, если я запускаю свои функциональные тесты (в моем / функциональном каталоге) с rake test: functionals.

Однако, если я просто запускаю rake-тест, чтобы запустить как модульный, так и функциональный тесты вместе, моя проверка не удалась во второй группе тестов (в данном случае функциональных) с сообщением «Проверка не удалась: имя уже занято».

Я считаю, что это вызвано тем, что функциональные тесты создают объекты с теми же параметрами, что и объекты, которые были созданы в модульных тестах, что наводит меня на мысль, что тестовая база данных не очищается между модульными и функциональными тестами.

Я использую последовательность factory_girl, чтобы иметь уникальные атрибуты для объектов, что означает, что factory_girl сбрасывается между тестами, а база данных - нет. Что я могу сделать, чтобы решить эту проблему? Есть ли способ очистить базу данных между двумя моими тестовыми пакетами?


person NolanDC    schedule 27.07.2009    source источник
comment
Вы нашли решение этой проблемы? У меня точно такая же. По какой-то причине заводские последовательности девушек сбрасываются между функциональным и модульным тестами.   -  person sandstrom    schedule 01.03.2011


Ответы (6)


Попробуйте написать это в своем test/test_helper.rb

eval IO.read(File.expand_path(File.dirname(__FILE__) + "/../Rakefile"))
class Test::Unit::TestCase
 ....
 #db:test:prepare won't work, don't know why,
 #as DROP DATABASE won't execute (me on PostgreSQL).
 #even if I write,
 #ActiveRecord::Base.connection.disconnect!
 Rake::Task["db:reset"].invoke
end

Это не рекомендуемое решение. Это делает тесты медленнее, но работает.

person Vikrant Chaudhary    schedule 28.07.2009
comment
Отлично, спасибо! На данный момент у меня не так много тестов, поэтому скорость пока не является большой проблемой. - person NolanDC; 28.07.2009
comment
Это работает и для меня! Кто-нибудь знает, почему это происходит? Некоторое время я использую фабрики, и это никогда не было проблемой. Кажется, что обновление с factory-girl до factory-girl-rails является причиной проблемы ... Я использую rails 3.2.2 - person Tania R; 18.07.2012

Решение командной строки для очистки (восстановления) тестовой базы данных:

rake db:test:prepare
person Amir Samakar    schedule 17.03.2013

Плагин rails под названием «override_rake_task» может использоваться для переопределения задачи Rake «test», которая определена внутри гема Rails. Это очень простая задача, которая выполняет одну за другой еще 3 задачи: test: units, test: functionals и test: integration. Вы можете включить выполнение задачи «db: test: purge», чтобы очистить тестовую базу данных перед выполнением test: functionals.

Очевидно, если вы не используете этот плагин и определите задачу в своем приложении rails с тем же именем, rake выполнит обе задачи: стандартную и вашу.

person Alex Kovshovik    schedule 27.07.2009
comment
Есть ли способ выполнить db: test: purge между модульным и функциональным тестами без переопределения задач rake по умолчанию? - person NolanDC; 27.07.2009
comment
Да, вы, вероятно, могли бы сделать то же самое без плагина, сначала удалив задачу по умолчанию и добавив новую с тем же кодом + db: test: purge: remove_task: test, затем task: test do ... end. Я видел это здесь: taknado.com/2007/7/30/ overriding-rake-tasks - person Alex Kovshovik; 29.07.2009

Вышеупомянутые решения не помогли мне. Если вы пытаетесь связаться с внешней базой данных, запуск модульных тестов может дать некоторые странные ошибки. По какой-то причине они не очищаются после запуска теста, поэтому вам нужно запустить rake db:test:purge после выполнения модульных тестов. Поместите это в свой Rakefile, и он должен это исправить.

Rake::Task["db:test:prepare"].enhance do
  Rake::Task["db:test:purge"].invoke
end
person jluebbert    schedule 31.10.2009

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

-I had a linux box, and was running code, that I knew should pass the tests.
-I bought a Mac with Lion installed and attempted to get my code running on that machine.
-I installed mysql from source

Все установилось нормально. Моя база данных работала, и рельсы могли получить к ней доступ. Однако, когда я проводил тесты, я столкнулся с той же проблемой. Я наткнулся на этот пост и попробовал оба предложенных решения (хотя это и не казалось проблемой с кодом, это казалось проблемой конфигурации, поскольку rake работал нормально на моем Linux-компьютере). Ни одно из решений не работает.

Я удалил mysql:

sudo rm /usr/local/mysql
sudo rm -rf /usr/local/mysql*
sudo rm -rf /Library/StartupItems/MySQLCOM
sudo rm -rf /Library/PreferencePanes/My*
sudo rm -rf /Library/Receipts/mysql*
sudo rm -rf /Library/Receipts/MySQL*
sudo rm /etc/my.cnf
sudo rm /usr/local/bin/mysql*

Я переустановил mysql с помощью homebrew вместо того, чтобы делать это вручную из исходного кода (этот шаг был любезно предоставлен советом коллеги):

export PATH="/usr/local/bin:/usr/local/sbin:/usr/local/mysql/bin:$PATH"
brew install https://github.com/adamv/homebrew-alt/raw/master/versions/mysql51.rb
unset TMPDIR
mysql_install_db

Затем я повторно запустил грабли, и все тесты прошли. Если кто-то пользуется Lion, собрал mysql из исходников и столкнулся с этой проблемой, это может быть решением.

person Ken Mazaika    schedule 06.10.2011

Очиститель БД - довольно приятная жемчужина, специально предназначенная для очистки между тестами. Он дает несколько вариантов, включая включение каждого теста в транзакцию и откат, усечение таблицы и удаление.

Он также поддерживает несколько ORMS, если вы не используете / используете более чем активную запись.

Документация довольно хороша и включает примеры ее использования с MiniTest, Rspec и Cucumber.

https://github.com/bmabey/database_cleaner

person varblob    schedule 08.06.2014