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

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

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

База данных rails test не очищается после некоторых прогонов

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

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

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

4b9b3361

Ответ 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: это нужно будет вручную выполнить из вашей оболочки, если вы хотите очистить свою базу данных.