कैसे लोड करें db: बीज डेटा टेस्ट डेटाबेस में स्वचालित रूप से?


122

मैं रेल डेटा लोड करने के नए मानक तरीके का उपयोग करने का प्रयास कर रहा हूँ रेल 2.3.4+, db:seed रेक कार्य ।

मैं निरंतर डेटा लोड कर रहा हूं, जो मेरे आवेदन के लिए वास्तव में सही ढंग से कार्य करने के लिए आवश्यक है।

db:seedपरीक्षणों से पहले काम करने का सबसे अच्छा तरीका क्या है , इसलिए डेटा पूर्व-आबादी है?

जवाबों:


120

db:seedरेक कार्य मुख्य रूप से बस को लोड करता है db/seeds.rbस्क्रिप्ट। इसलिए डेटा लोड करने के लिए बस उस फ़ाइल को निष्पादित करें।

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

# or

Rails.application.load_seed

कहां जगह है जो इस बात पर निर्भर करता है कि आप कौन से परीक्षण ढांचे का उपयोग कर रहे हैं और क्या आप चाहते हैं कि इसे हर परीक्षण से पहले या शुरुआत में सिर्फ एक बार लोड किया जाए। आप इसे setupकॉल या test_helper.rbफ़ाइल में रख सकते हैं ।


4
मुझे सादगी पसंद है, लेकिन किसी कारण से इस लाइन को जोड़ने से मेरे test_helper.rbलिए काम नहीं किया, हालांकि stackoverflow.com/a/1998520/68210 ने किया।
डेनियल एक्स मूर

37
रेल के नए संस्करणों में आप यह कर सकते हैं: Rails.application.load_seed
स्टीव

@Steve आपका धन्यवाद - क्या आप जानते हैं कि Rails.application.load_seed को कहां रखा जाए यदि कोई उदाहरण के लिए rspec / capybarra का उपयोग कर रहा है?
BKSpurgeon

1
@BKSpurgeon मैं अपने अनुप्रयोगों में बीज डेटा को काफी कम लोड करता हूं क्योंकि इसे चलाने के लिए विशिष्ट डेटा की आवश्यकता होती है और कारखाना अभी बहुत जटिल है। मैंने अपनी रेल_हेलर फ़ाइल के Rails.application.load_seedठीक नीचे रखा require 'rspec/rails'। यदि आप डेटाबेस_क्लीनर मणि का उपयोग कर रहे हैं - तो यह सुनिश्चित करने के लिए थोड़ी सी ट्विकिंग की आवश्यकता होगी कि आप प्रत्येक परीक्षण के बाद अपना सीड डेटा नहीं खोते हैं और आप यह
जान

रेल 5.x में मैंने इसे test/test_helper.rbमौजूदा require 'rails/test_help'लाइन के बाद जोड़ा
एंड्रयू

87

मैं कहूंगा कि यह होना चाहिए

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

क्योंकि db: परीक्षण: अगर आपके पास config.active_record.schema_format =: sql (db: परीक्षण: clone_structure है) तो लोड निष्पादित नहीं किया गया है


4
रनिंग के साथ --traceमुझे यह समझने में मदद मिली कि यह कैसे काम करता है।
जारेड बेक

4
@BookOfGreg मेरे पास यह लिब / कार्य / test_seed.rake में है जो मैंने खुद बनाया है
यूजीन

6
सिर्फ यही क्यों नहीं? task 'db:test:prepare' => 'db:seed'
कार्सन रिंके

3
रेल्स के लिए 4.0.0 फाइनल ऐड ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['test'])पहलेRake::Task["db:seed"].invoke
jicic_

3
@CarsonReinke - क्योंकि तब जब पर्यावरण db:seedचलता है development... अजीब तरह से।
डेनिषस्किन

17

कुछ इस तरह से लिब / टास्क / test_seed.rake में डालकर db: टेस्ट: लोड:

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

15

मेरा मानना ​​है कि ऊपर स्टीव की टिप्पणी सही उत्तर होनी चाहिए। आप Rails.application.load_seedअपने टेस्ट एन्विरोनमेंट में सीड डेटा लोड करने के लिए उपयोग कर सकते हैं । हालाँकि, यह डेटा कब और कितनी बार लोड किया जाता है, कुछ बातों पर निर्भर करता है:

न्यूनतम का उपयोग करना

सभी परीक्षणों से पहले एक बार इस फ़ाइल को चलाने का कोई सुविधाजनक तरीका नहीं है ( इस गीथब मुद्दे को देखें )। आपको प्रत्येक परीक्षण से पहले एक बार डेटा लोड करने की आवश्यकता होगी, आपकी परीक्षण फ़ाइलों की सेटअप विधि में संभावना:

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

  def setup
    Rails.application.load_seed
  end

  # tests here...

end

RSpec का उपयोग करना

before(:all)इस मॉडल के सभी परीक्षण के लिए बीज डेटा लोड करने के लिए RSpec की विधि का उपयोग करें :

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

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

उम्मीद है की यह मदद करेगा।


2
अब तक का सर्वश्रेष्ठ उत्तर
यूरी घेंसेव

मैं कुछ ऐसा ही करता हूं, सिवाय इसके कि मैं before(:suite)इसके बजाय इसे लागू कर रहा हूं before(:all)। स्वरूपित कोड को शामिल करने के लिए एक अलग उत्तर पोस्ट किया।
मार्क श्नाइडर

3

हम db: बीज को db के एक भाग के रूप में शामिल कर रहे हैं: परीक्षण: तैयार, इसके साथ:

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

इस तरह, बीज डेटा को पूरे परीक्षण चलाने के लिए एक बार लोड किया जाता है, न कि एक बार परीक्षण वर्ग के अनुसार।


4
क्या आपने एक नया db: टेस्ट बनाया: ऐसा करने के लिए कार्य तैयार करें? क्या आप कोड पोस्ट कर सकते हैं?
ल्यूक फ्रेंकल

3

सीडबैंक का उपयोग करने वालों के लिए, यह बदलता है कि बीज कैसे लोड किए जाते हैं, इसलिए आप शायद load ...यहां दिए गए समाधान का उपयोग नहीं कर सकते / नहीं कर सकते ।

और सिर्फ Rake::Task['db:seed'].invoketest_helper में डालने के परिणामस्वरूप:

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

लेकिन जब हमने उससे पहले load_tasks जोड़ा, तो यह काम किया:

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

2

जोड़ने Rake::Task["db:seed"].invokeके लिए db:test:prepareरेक कार्य मेरे लिए काम नहीं किया। अगर मैंने डेटाबेस तैयार किया rake db:test:prepare, और फिर परीक्षण वातावरण में कंसोल में प्रवेश किया, तो मेरे सभी बीज वहां थे। हालाँकि, बीज मेरे परीक्षणों के बीच कायम नहीं रहा।

load "#{Rails.root}/db/seeds.rb"मेरी सेटअप विधि में जोड़ना ठीक काम किया, हालांकि।

मैं इन बीजों को स्वतः लोड करने और बनाए रखने के लिए प्यार करता हूँ, लेकिन मुझे अभी तक ऐसा करने का कोई तरीका नहीं मिला है!


0

मैट के जवाब पर बिल्डिंग, अगर उस तरह का मार्ग ले रहा है, तो मैं Rails.application.load_seedएक के बजाय एक before(:suite)ब्लॉक में कॉल करने की सलाह देता हूंrspec_helper.rbbefore(:all) किसी भी फाइल में ब्लॉक की । इस तरह से बीजारोपण कोड को पूरे परीक्षण सूट के लिए केवल एक बार परीक्षण के प्रत्येक समूह के लिए एक बार लागू किया जाता है।

rspec_helper.rb:

RSpec.configure do |config|
  ...
  config.before(:suite) do
    Rails.application.load_seed
  end
  ...
end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.