Rails 4: Bagaimana cara mereset database pengujian?

88

Saya menggunakan Rails 4 dan telah memperhatikan beberapa tes RSpec saya gagal karena beberapa refactoring tes saya menggunakan filter sebelum (mungkin karena transaksi). Posting ini menjelaskan masalah serupa:

Rails test database tidak dibersihkan setelah beberapa kali dijalankan

Sebagai pengganti menggunakan permata DatabaseCleaner, apakah ada perintah rake untuk menghapus database pengujian? Saya percaya rake db:test:preparesudah usang di Rails 4. Juga, jika sebelum transaksi seperti

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

gigih. Apakah ada cara alternatif untuk refactoring untuk menghindari kebutuhan untuk menghapus database pengujian secara manual?

Solomon_Ecclesiastes
sumber

Jawaban:

121

Solusi yang berlebihan adalah:

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

Anda bisa membuat ini semua dalam tugas menyapu dan menjalankannya.

Solusi lain dari sini adalah dengan menyertakan spec_helper.rbfile Anda berikut ini

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

Penafian: Saya belum menguji ini dan Anda harus membaca posting SO karena mungkin tidak berfungsi di semua situasi.

Karena itu, saya akan merekomendasikan menggunakan permata pembersih database untuk menghindari situasi seperti ini.

ChrisBarthol
sumber
1
3 rake db pertama: * hanya dapat diganti dengan yang terakhir karena menghapus semua tabel dan membuatnya dari skema.
konole
2
untuk Rails 5, gunakan ApplicationRecordsebagai pengganti ActiveRecord::Base blog.bigbinary.com/2015/12/28/…
Yo Ludke
3
Gunakan rake db:structure:loadjika Anda menggunakan structure.sql, bukan schema.rb.
Archonic
2
Satu liner yang lebih rapi untuk hal di atas adalah:RAILS_ENV=test bundle exec rake db:drop db:create db:schema:load
stwr667
98

Bisa jadi:

bundle exec rake db:reset RAILS_ENV=test
mpz
sumber
21
Saya perhatikan itu juga berjalan rake db:seed ... yang mungkin atau mungkin tidak menjadi masalah
Harry Wood
1
Jika Anda menggunakan Rails 5, perintahnya sekarang menjadi rail, bukan rake:bundle exec rails db:reset RAILS_ENV=test
Uriel Hernández
19

Terkadang Anda mungkin perlu menjalankan perintah ini (opsional)

rails db:environment:set RAILS_ENV=test

Tapi yang pasti untuk menghapus database pengujian Anda semudah:

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

d1jhoni1b
sumber
2

Anda dapat menambahkan filter setelah menghapus semua entri dari tabel terkait.

nbirla.dll
sumber
0

Secara teori ini ActiveRecord::Migration.maintain_test_schema!harus melakukan trik. Masukkanrails_helper.rb

untuk Tuan
sumber
0

Saya akhirnya menulis tugas rake sederhana yang menjatuhkan / memigrasi (atau menjatuhkan & memigrasi) semua database pengujian dan pengembangan, tergantung pada perintah yang dijalankan.

Ini mencakup fungsionalitas untuk meminta pengguna, apakah mereka ingin melanjutkan ketika terjadi kesalahan, dan menggunakan metode popen3 Open3 (sehingga kita dapat mengakses stdin, stdout dan stderr; dan setiap perintah yang gagal tidak mengakibatkan proses tugas rake membatalkan (tidak seperti saat menggunakan sistem )).

Semoga ini membantu seseorang. :)

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

edit: Ini perlu dijalankan secara manual dari shell Anda, kapan pun Anda ingin menghapus database Anda.

XtraSimplicity
sumber