it-swarm.com.ru

Rails 4: Как сбросить тестовую базу данных?

Я нахожусь на Rails 4 и заметил, что некоторые из моих тестов RSpec терпят неудачу, потому что некоторые из моих рефакторингов теста используют фильтр before (предположительно из-за транзакций). Этот пост описывает похожую проблему:

Тестовая база данных Rails не очищается после некоторых запусков

Вместо того, чтобы использовать гем DatabaseCleaner, есть ли команда rake для очистки тестовой базы данных? Я считаю, что rake db:test:prepare устарела в Rails 4. Кроме того, если до транзакции, как

post :create, user: Fabricate.attributes_for(:user)

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

73
Solomons_Ecclesiastes

Решение проблемы излишнего количества будет:

bundle exec rake db:drop Rails_ENV=test
bundle exec rake db:create Rails_ENV=test
bundle exec rake db:schema:load Rails_ENV=test

Вы можете сделать все это в виде граблей и запустить это.

Другое решение из здесь состоит в том, чтобы включить следующий ваш spec_helper.rb файл

config.after :all do
  ActiveRecord::Base.subclasses.each(&:delete_all)
end

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

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

101
ChrisBarthol

Может быть:

bundle exec rake db:reset Rails_ENV=test
72
mpz

Иногда вам может понадобиться запустить эту команду (необязательно)

Rails db:environment:set Rails_ENV=test

Но наверняка уничтожить вашу тестовую базу данных так же просто, как:

Rails db:drop db:create db:migrate Rails_ENV=test

3
d1jhoni1b

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

1
nbirla

Теоретически этот ActiveRecord::Migration.maintain_test_schema! должен помочь. Поместите это в Rails_helper.rb

0
tomr

В итоге я написал простую задачу rake, которая удаляет/переносит (или удаляет и переносит) все базы данных тестирования и разработки, в зависимости от выполняемой команды.

Он включает в себя функциональность для запроса пользователю о том, хотят ли они продолжить работу при возникновении ошибки, и использует метод Open3 popen3 (такой, что мы можем получить доступ к stdin, stdout и stderr; и любые неудачные команды не приводят к процессу задачи rake прерывание (в отличие от использования system)).

Надеюсь, это кому-нибудь поможет. :)

https://github.com/xtrasimplicity/rake_all_db_helper/

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

0
XtraSimplicity