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

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

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

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

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

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

4b9b3361

Ответ 1

Попробуйте записать это в 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

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

Ответ 2

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

rake db:test:prepare

Ответ 3

Плагин rails, называемый "override_rake_task", может использоваться для переопределения задачи "Rake task", которая определена внутри, если Rails gem. Это очень простая задача, которая выполняет три другие задачи один за другим: test: units, test: функционалы и test: integration. Вы можете включить выполнение задачи "db: test: purge", чтобы очистить тестовую БД до выполнения тестовых функций:

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

Ответ 4

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

Rake::Task["db:test:prepare"].enhance do
  Rake::Task["db:test:purge"].invoke
end

Ответ 5

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

-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

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

Ответ 6

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

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

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

https://github.com/bmabey/database_cleaner