Saya mencoba menggunakan cara standar baru untuk memuat data seed di Rails 2.3.4+, db:seed
tugas rake.
Saya memuat data konstan, yang diperlukan agar aplikasi saya benar-benar berfungsi dengan benar.
Apa cara terbaik db:seed
untuk menjalankan tugas sebelum pengujian, sehingga datanya sudah terisi sebelumnya?
ruby-on-rails
testing
seed
Luke Francl
sumber
sumber
test_helper.rb
tidak berhasil untuk saya meskipun stackoverflow.com/a/1998520/68210 melakukannya.Rails.application.load_seed
tepatrequire 'rspec/rails'
di bawah file rails_helper saya. Jika Anda menggunakan permata database_cleaner - ini akan memerlukan sedikit penyesuaian untuk memastikan Anda tidak kehilangan data benih setelah setiap pengujian dan Anda dapat menemukannya dalam dokumentasi permata itu sendiritest/test_helper.rb
setelahrequire 'rails/test_help'
baris yang adaMenurutku seharusnya begitu
Karena db: test: load tidak dijalankan jika Anda memiliki config.active_record.schema_format =: sql (db: test: clone_structure is)
sumber
--trace
membantu saya memahami cara kerjanya.task 'db:test:prepare' => 'db:seed'
ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['test'])
sebelumRake::Task["db:seed"].invoke
db:seed
dijalankan adalahdevelopment
... aneh.Menempatkan sesuatu seperti ini di lib / task / test_seed.rake harus menjalankan tugas seed setelah db: test: load:
sumber
Saya yakin komentar Steve di atas seharusnya menjadi jawaban yang benar. Anda dapat menggunakan
Rails.application.load_seed
untuk memuat data benih ke dalam lingkungan pengujian Anda. Namun, kapan dan seberapa sering data ini dimuat bergantung pada beberapa hal:Menggunakan Minitest
Tidak ada cara mudah untuk menjalankan file ini satu kali sebelum semua tes (lihat masalah Github ini ). Anda harus memuat data satu kali sebelum setiap pengujian, kemungkinan besar dalam metode penyiapan file pengujian Anda:
Menggunakan RSpec
Gunakan
before(:all)
metode RSpec untuk memuat data benih untuk semua pengujian untuk model ini:Semoga ini membantu.
sumber
before(:suite)
bukanbefore(:all)
. Memposting jawaban terpisah untuk menyertakan kode yang diformat.Kami memanggil db: seed sebagai bagian dari db: test: persiapkan, dengan:
Rake::Task["db:seed"].invoke
Dengan begitu, data seed dimuat satu kali untuk keseluruhan pengujian yang dijalankan, dan tidak sekali per kelas pengujian.
sumber
Bagi mereka yang menggunakan bank benih, ini mengubah cara pemuatan benih, jadi Anda mungkin tidak dapat / tidak ingin menggunakan
load ...
solusi yang disediakan di sini.Dan hanya dengan memasukkan
Rake::Task['db:seed'].invoke
test_helper menghasilkan:Tetapi ketika kami menambahkan load_tasks sebelum itu, itu berhasil:
sumber
Menambahkan
Rake::Task["db:seed"].invoke
kedb:test:prepare
tugas menyapu tidak berhasil untuk saya. Jika saya menyiapkan database denganrake db:test:prepare
, dan kemudian memasuki konsol dalam lingkungan pengujian, semua benih saya ada di sana. Namun, benih tidak bertahan di antara pengujian saya.Menambahkan
load "#{Rails.root}/db/seeds.rb"
ke metode penyiapan saya berfungsi dengan baik.Saya ingin agar benih ini dimuat secara otomatis dan bertahan, tetapi saya belum menemukan cara untuk melakukannya!
sumber
Berdasarkan jawaban Matt, jika mengambil rute semacam itu, saya sarankan menelepon
Rails.application.load_seed
dibefore(:suite)
blokrspec_helper.rb
daripada dibefore(:all)
blok di file apa pun. Dengan cara itu, kode penyemaian hanya dipanggil sekali untuk seluruh rangkaian pengujian, bukan sekali untuk setiap grup pengujian.rspec_helper.rb:
sumber