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

87

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

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

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

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

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

Соломоновы острова Экклезиаст
источник

Ответы:

120

Излишним решением было бы:

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, поскольку оно может работать не во всех ситуациях.

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

Крис Бартол
источник
1
Первые 3 рейка db: * можно заменить только на последнюю, так как он удаляет все таблицы и создает их из схемы.
konole
2
для Rails 5 используйте ApplicationRecordвместо ActiveRecord::Base blog.bigbinary.com/2015/12/28/…
Yo
3
Используйте, rake db:structure:loadесли вы используете structure.sql вместо schema.rb.
Archonic 01
2
Более аккуратный 1 вкладыш для вышеупомянутого просто:RAILS_ENV=test bundle exec rake db:drop db:create db:schema:load
stwr667
98

Может быть:

bundle exec rake db:reset RAILS_ENV=test
mpz
источник
20
Я заметил, что это тоже работает rake db:seed ... что может быть, а может и не быть проблемой,
Гарри Вуд
1
Если вы используете Rails 5, команда теперь - rails вместо rake:bundle exec rails db:reset RAILS_ENV=test
Uriel Hernández
15

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

rails db:environment:set RAILS_ENV=test

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

rails db:drop db:create db:migrate RAILS_ENV=test

d1jhoni1b
источник
2

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

nbirla
источник
0

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

Мистеру
источник
0

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

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

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

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

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

XtraSimplicity
источник