Db: seed verileri test veritabanına otomatik olarak nasıl yüklenir?


122

db:seedTırmık görevi olan Rails 2.3.4+ 'de tohum verilerini yüklemenin yeni standart yolunu kullanmaya çalışıyorum .

Uygulamamın gerçekten doğru çalışması için gerekli olan sabit verileri yüklüyorum.

db:seedVerilerin önceden doldurulması için görevi testlerden önce çalıştırmanın en iyi yolu nedir ?

Yanıtlar:


120

db:seedTırmık görev öncelikle sadece yükler db/seeds.rbsenaryoyu. Bu nedenle, verileri yüklemek için sadece o dosyayı çalıştırın.

load "#{Rails.root}/db/seeds.rb"

# or

Rails.application.load_seed

Bunun nereye yerleştirileceği, hangi test çerçevesini kullandığınıza ve bunun her testten önce mi yoksa başlangıçta bir kez mi yüklenmesini istediğinize bağlıdır. Onu bir setuparamaya veya bir test_helper.rbdosyaya koyabilirsiniz .


4
Sadeliği seviyorum, ancak bazı nedenlerden dolayı bu satırı eklemek benim test_helper.rbiçin işe yaramadı, ancak stackoverflow.com/a/1998520/68210 işe yaradı.
Daniel X Moore

37
Rayların daha yeni sürümlerinde şunları yapabilirsiniz: Rails.application.load_seed
Steve

@Steve teşekkür ederim - örneğin rspec / capybarra kullanılıyorsa Rails.application.load_seed'i nereye koyacağınızı biliyor musunuz?
BKSpurgeon

1
@BKSpurgeon Uygulamalarıma tohum verilerini biraz yüklüyorum çünkü çalıştırmak için belirli veriler gerekiyor ve fabrika çok karmaşık. Rails_helper dosyamın Rails.application.load_seedhemen altına koydum require 'rspec/rails'. Database_cleaner gem kullanıyorsanız - her testten sonra çekirdek verilerinizi kaybetmediğinizden emin olmak için biraz ince ayar yapmanız gerekecek ve bunu
cevherin

Rails 5.x'te bunu test/test_helper.rbmevcut require 'rails/test_help'satırdan sonra ekledim
Andrew

87

Olması gerektiğini söyleyebilirim

namespace :db do
  namespace :test do
    task :prepare => :environment do
      Rake::Task["db:seed"].invoke
    end
  end
end

Çünkü config.active_record.schema_format =: sql (db: test: clone_structure is) varsa db: test: load yürütülmez


4
Tırmıkla koşmak, --tracebunun nasıl çalıştığını anlamama yardımcı oldu.
Jared Beck

4
@BookOfGreg Kendim oluşturduğum lib / tasks / test_seed.rake dosyasında var
Eugene Bolshakov

6
Neden sadece bu değil? task 'db:test:prepare' => 'db:seed'
Carson Reinke

3
Rails 4.0.0 için son ekleme ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['test'])öncesiRake::Task["db:seed"].invoke
janic_

3
@CarsonReinke - çünkü o zaman db:seedçalışma sırasında ortam development... garip bir şekilde.
denishaskin

17

Lib / tasks / test_seed.rake içine böyle bir şey koymak, db: test: load'dan sonra çekirdek görevini çağırmalıdır:

namespace :db do
  namespace :test do
    task :load => :environment do
      Rake::Task["db:seed"].invoke
    end
  end
end

15

Steve'in yukarıdaki yorumunun doğru cevap olması gerektiğine inanıyorum . Sen kullanabilirsiniz Rails.application.load_seedtest envoironment içine tohum verilerini yüklemek için. Ancak, bu verilerin ne zaman ve ne sıklıkla yükleneceği birkaç şeye bağlıdır:

Minitest kullanma

Bu dosyayı tüm testlerden önce çalıştırmanın uygun bir yolu yoktur ( bu Github sorununa bakın ). Verileri, muhtemelen test dosyalarınızın kurulum yönteminde, her testten önce bir kez yüklemeniz gerekecektir:

# test/models/my_model_test.rb
class LevelTest < ActiveSupport::TestCase

  def setup
    Rails.application.load_seed
  end

  # tests here...

end

RSpec kullanma

before(:all)Bu model için tüm testler için tohum verilerini yüklemek üzere RSpec'in yöntemini kullanın :

describe MyModel do
  before(:all) do
  Rails.application.load_seed
end

describe "my model..." do
  # your tests here
end

Bu yardımcı olur umarım.


2
Şimdiye kadarki en iyi cevap
Yuri Ghensev

Bunun before(:suite)yerine onu çağırmam dışında benzer bir şey yapıyorum before(:all). Biçimlendirilmiş kodu eklemek için ayrı bir yanıt yayınlandı.
Mark Schneider

3

Db: seed'i db: test: ready'nin bir parçası olarak çağırıyoruz:

Rake::Task["db:seed"].invoke

Bu şekilde, çekirdek verileri tüm test çalıştırması için bir kez yüklenir ve her test sınıfı için bir kez yüklenmez.


4
Yeni bir db: test yarattınız: bunu yapmak için görev hazırladınız mı? Kodu gönderebilir misin?
Luke Francl

3

Seedbank kullananlar için, tohumların nasıl yükleneceğini değiştirir, bu nedenle muhtemelen load ...burada sağlanan çözümü kullanamazsınız / kullanmak istemezsiniz .

Ve sadece Rake::Task['db:seed'].invoketest_helper'ı koymak şu sonuç verdi:

Don't know how to build task 'db:seed' (RuntimeError)

Ama ondan önce load_tasks eklediğimizde işe yaradı:

MyApp::Application.load_tasks
Rake::Task['db:seed'].invoke

2

Ekleme Rake::Task["db:seed"].invokeiçin db:test:preparetırmık görev benim için çalışmadı. Veritabanını ile hazırlayıp rake db:test:preparedaha sonra konsola test ortamında girdiysem tüm tohumlarım oradaydı. Ancak, testlerim arasında tohumlar kalmadı.

load "#{Rails.root}/db/seeds.rb"Kurulum yöntemime eklemek yine de iyi çalıştı.

Bu tohumların otomatik olarak yüklenmesini ve kalıcı olmasını isterdim, ancak henüz bunu yapmanın bir yolunu bulamadım!


0

Matt'in cevabına dayanarak, bu tür bir rotayı kullanıyorsanız, aramanızı tavsiye ederim Rails.application.load_seed herhangi bir dosyadaki bir blok yerine bir before(:suite)blok içinde . Bu şekilde, tohumlama kodu her test grubu için bir kez yerine tüm test paketi için yalnızca bir kez çağrılır.rspec_helper.rbbefore(:all)

rspec_helper.rb:

RSpec.configure do |config|
  ...
  config.before(:suite) do
    Rails.application.load_seed
  end
  ...
end
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.