Rails 4: Як скинути тестову базу даних?


87

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

база даних тесту рейок не очищається після деяких запусків

Замість використання самоцвіту DatabaseCleaner, чи існує команда rake для очищення тестової бази даних? Я вважаю 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/…
Йо

3
Використовуйте, rake db:structure:loadякщо ви використовуєте structure.sql замість schema.rb.
Archonic

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

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


2

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


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/

редагувати: Це потрібно буде виконати вручну з вашої оболонки, коли б ви хотіли очистити базу даних.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.