কীভাবে ডিবি লোড করবেন: বীজ ডেটা স্বয়ংক্রিয়ভাবে পরীক্ষার ডাটাবেসে?


122

আমি রেক db:seedটাস্ক , ২.৩.৪++ রেলগুলিতে বীজ ডেটা লোড করার নতুন মানক উপায়টি ব্যবহার করার চেষ্টা করছি ।

আমি ধ্রুবক ডেটা লোড করছি, যা আমার অ্যাপ্লিকেশনটির জন্য সঠিকভাবে কাজ করতে প্রয়োজন to

db:seedপরীক্ষাগুলির আগে টাস্কটি চালানোর সর্বোত্তম উপায় কী , তাই ডেটা প্রাক-জনবহুল হয়?

উত্তর:


120

db:seedমই দিয়া আহরণ করা টাস্ক প্রাথমিকভাবে মাত্র লোড db/seeds.rbস্ক্রিপ্ট। সুতরাং কেবল ডেটা লোড করার জন্য সেই ফাইলটি কার্যকর করুন।

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

# or

Rails.application.load_seed

আপনি কোন পরীক্ষার কাঠামোটি ব্যবহার করছেন এবং আপনি প্রতিটি পরীক্ষার আগে বা শুরুতে একবারে এটি লোড করা চান কিনা তার উপরে নির্ভর করে কোথায় to আপনি এটি একটি setupকল বা একটি test_helper.rbফাইল রাখতে পারেন।


4
আমি সরলতা পছন্দ করি, কিন্তু কোনও কারণে এই পংক্তিটি যুক্ত করা আমার test_helper.rbপক্ষে কাজ করেনি যদিও স্ট্যাকওভারফ্লো . com/a/1998520/68210 করেছে।
ড্যানিয়েল এক্স মুর

37
রেলের নতুন সংস্করণগুলিতে আপনি এটি করতে পারেন: Rails.application.load_seed
স্টিভ

@ স্টিভ আপনাকে ধন্যবাদ - উদাহরণস্বরূপ, যদি কেউ আরএসপি / ক্যাপিবার ব্যবহার করে তবে রেয়েলস.অ্যাপ্লিকেশন.লোড_সিড কোথায় রাখবেন জানেন?
বিকেএসপুরজন

1
@ বি কে এসপুরজন আমি আমার অ্যাপ্লিকেশনগুলিতে বীজের ডেটা বেশ কিছুটা লোড করি কারণ এটি চালানোর জন্য নির্দিষ্ট ডেটা প্রয়োজন এবং কারখানাটি খুব জটিল। আমি আমার রেল_হেল্পার ফাইলের 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

কারণ ডিবি: টেস্ট: লোড কার্যকর করা হয় না যদি আপনার কনফিগারেশন.রেটিভ_সেকর্ড.সেমি_ফর্ম্যাট =: এসকিএল (ডিবি: পরীক্ষা: ক্লোন_ স্ট্রাকচার) থাকে


4
সাথে রাক চালানো --traceআমাকে বুঝতে সহায়তা করে যে এটি কীভাবে কাজ করে।
জ্যারেড বেক

4
@ বুকঅফগ্রিগ আমার কাছে এটি আমার নিজের মতো করে কাজ / পরীক্ষা / টেস্ট_সিড.আপনি তৈরি করেছেন
ইউজিন বলশাকভ

6
কেন শুধু এই না? task 'db:test:prepare' => 'db:seed'
কারসন রিনকে

3
জন্য পাগল 4.0.0 চূড়ান্ত অ্যাড ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['test'])করার আগেRake::Task["db:seed"].invoke
janic_

3
@ কারসনরইনকে - কারণ তখন db:seedরান যখন পরিবেশ development... অদ্ভুতভাবে।
নিনিশাসকিন

17

Lib / Tasks / test_seed.rake এ জাতীয় কিছু রাখার পরে বীজের কাজটি ডিবির পরে নেওয়া উচিত: পরীক্ষা: লোড:

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

আরএসপেক ব্যবহার করে

before(:all)এই মডেলের জন্য সমস্ত পরীক্ষার জন্য বীজ ডেটা লোড করতে আরএসপেকের পদ্ধতিটি ব্যবহার করুন :

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

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

আশাকরি এটা সাহায্য করবে.


2
এখন পর্যন্ত সেরা উত্তর
ইউরি ঘেনসেভ

আমি অনুরূপ কিছু করি, আমি এটির before(:suite)পরিবর্তে এটিতে অনুরোধ করছি before(:all)। বিন্যাসিত কোড অন্তর্ভুক্ত করতে একটি পৃথক উত্তর পোস্ট করেছেন Posted
মার্ক স্নাইডার

3

আমরা ডিবি: ডিবি এর অংশ হিসাবে বীজ আহ্বান করছি: পরীক্ষা: প্রস্তুত, সাথে:

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

এইভাবে, পুরো পরীক্ষার জন্য একবার বীজের ডেটা লোড করা হয়, এবং পরীক্ষার ক্লাসে একবার নয়।


4
আপনি কি নতুন ডিবি তৈরি করেছেন: পরীক্ষা: তা করার জন্য টাস্ক প্রস্তুত? আপনি কোড পোস্ট করতে পারেন?
লুক ফ্রাঙ্কল

3

যারা বীজ ব্যাঙ্ক ব্যবহার করেন তাদের ক্ষেত্রে এটি কীভাবে বীজ বোঝাই করা হয় তা পরিবর্তিত হয়, সুতরাং আপনি সম্ভবত load ...এখানে সরবরাহিত সমাধানটি ব্যবহার করতে / চাইবেন না ।

এবং কেবল Rake::Task['db:seed'].invokeটেস্টহেল্পারে রাখার ফলস্বরূপ:

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

তবে যখন আমরা এর আগে লোড_টাস্কগুলি যুক্ত করেছি, তখন এটি কাজ করেছিল:

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.