Rails 4: Как reset проверить базу данных?
Я на Rails 4 и заметил, что некоторые из моих тестов RSpec терпят неудачу, потому что некоторые из моих тестовых рефакторингов используют фильтр before (предположительно из-за транзакций). В этой статье описывается аналогичная проблема:
База данных rails test не очищается после некоторых прогонов
Вместо использования камкордера DatabaseCleaner существует ли команда rake для очистки тестовой базы данных? Я считаю, что rake db:test:prepare
устарел в Rails 4. Кроме того, если перед транзакциями вроде
post :create, user: Fabricate.attributes_for(:user)
являются постоянными. Есть ли альтернативный способ рефакторинга, чтобы избежать необходимости вручную очищать тестовую базу данных?
Ответы
Ответ 1
Решение о переполнении будет:
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
Отказ от ответственности: я не тестировал это, и вы должны прочитать сообщение fooobar.com/questions/84862/..., поскольку оно может не работать во всех ситуациях.
При этом я бы рекомендовал использовать очиститель базы данных, чтобы избежать таких ситуаций.
Ответ 2
Это может быть:
bundle exec rake db:reset RAILS_ENV=test
Ответ 3
Иногда вам может понадобиться запустить эту команду (необязательно)
rails db:environment:set RAILS_ENV=test
Но наверняка уничтожить вашу тестовую базу данных так же просто, как:
rails db:drop db:create db:migrate RAILS_ENV=test
Ответ 4
Вы можете добавить фильтр после удаления всех записей из соответствующих таблиц.
Ответ 5
В теории этот ActiveRecord::Migration.maintain_test_schema!
должен сделать трюк. Поместите его в rails_helper.rb
Ответ 6
В итоге я написал простую задачу rake, которая отбрасывает/переносит (или удаляет и переносит) все базы данных тестирования и разработки в зависимости от выполняемой команды.
Он включает в себя функциональные возможности для запроса пользователю о том, будут ли они продолжаться при возникновении ошибки, и использует метод Open3 popen3 (чтобы мы могли получить доступ к stdin, stdout и stderr, а любые неудачные команды не приводили к rake task process aborting (в отличие от использования системы)).
Надеюсь, это поможет кому-то.:)
https://github.com/xtrasimplicity/rake_all_db_helper/
edit: это нужно будет вручную выполнить из вашей оболочки, если вы хотите очистить свою базу данных.