سؤال

أنا أستخدم seeds.rb لملء بعض البيانات المرجعية لنموذج الحالة:

State.create :name => 'Alabama', :abbreviation => 'AL'
State.create :name => 'Alaska', :abbreviation => 'AK'
# ...

على الرغم من أنني لا أستخدم تركيبات الدولة (نظرا لأن بيانات البذور الخاصة بها لتبدأ، أعتقد أنه لن يكون جفافا لتكرار هذا الاختبارات بحتة)، يبدو أن إطار اختبار القضبان يحذف جميع بيانات بذور الدولة أثناء الاختبار. (أنا أسقط وإعادة إنشاء وترحيل وإعادة تقييم اختبار DB، وأكدت البيانات موجودة قبل اختبار وحدة وحدة.)

والنتيجة هي هذا التأكيد ينجح في seeds.rb لكن الفشل في اختبار خط واحد:

assert_equal 51, State.all.size

1) Failure:
test_state_seeds_are_present(StateTest) [/test/unit/state_test.rb:24]:
<51> expected but was
<0>.
1 tests, 1 assertions, 1 failures, 0 errors

لقد جربت كل من إدراج نماذج غير حكومية بشكل صريح في بيان تركيبات فئة اختبار الأساس، وكذلك التقليب علامة تركيبات المعاملات (كما هو متوقع، وهذا يؤثر فقط على السجلات التي تم إنشاؤها أثناء الاختبار). بطبيعة الحال لا يوجد اختبار قيد النظر في حد ذاته حذف هذه السجلات.

يتم حذف سجلات الدولة دائما. هل هناك طريقة لإخبار القضبان أن تحصل على يدها خارج بيانات البذور؟ هل أحتاج إلى تكرار جميع البيانات الموجودة في المباريات للتأكد من إعادة تحميلها؟ باختصار حدث سياسي كبير، أتوقع أن تكون بيانات الدولة مستقرة نسبيا.

تيا

هل كانت مفيدة؟

المحلول

اختبارات حذف جميع البيانات من قاعدة البيانات ثم قم بتحميل المباريات الخاصة بك (إذا كان لديك أي).

تحتاج إلى الحصول على مساعد الاختبار الخاص بك لتحميل ملف البذور قبل تشغيل الاختبارات. هناك عدة طرق للقيام بذلك، تحقق من سؤالي المماثل: كيفية تحميل DB: بيانات البذور في قاعدة بيانات الاختبار تلقائيا؟

أسهل طريقة هي فقط لإضافة

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

إلى أعلى ملف Test_helper.rb (على افتراض أنك تستخدم إطار الاختبار المدمج).

نصائح أخرى

لم يتم دمج ميزة "SEED" في بنية الاختبار. تم تصميم الاختبارات حول المباريات وفي كل مرة تقوم فيها بتشغيل مجموعة الاختبار، يقوم القضبان بتحميل البيانات من المباريات وتحل محل المحتوى الحالي.

ومع ذلك، فإن وجود قاعدة البيانات المكتظة بالسكان مع بيانات البذور الخاصة بك واضحة حقا.

في ملف Test_Helper.rb الخاص بك أضف طريقة إعداد جديدة في القاعدة ActionSupport::TestCase صف دراسي.

class ActionSupport::TestCase < ...

  setup :load_seeds

  protected 

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

end

وأنا أتفق مع WEPPOS بالنسبة لأفضل طريقة للقيام بذلك، ولكن من أجل الاكتمال والاستغلال للأشخاص الذين قد يكون لديهم بالفعل ملفات لاعبا استكيجية يمكنك اتخاذ النهج الآخر والبذور قاعدة البيانات الخاصة بك من المباريات الحالية.

يتم إنجاز ذلك عن طريق القيام بشيء ما التالي في ملف DB / SEEDS.RB

RAILS_FIXTURES = "#{Rails.root}/spec/fixtures"

models_loaded_from_fixtures = %w[Modela Modelb Modelc ....]

models_loaded_from_fixtures.each do |model|
  Fixtures.create_fixtures(RAILS_FIXTURES, "#{model.tableize}")
  puts "Loaded #{model.constantize.all.size} #{model.pluralize}"
end

يمكنك بدلا من ذلك قراءة دليل التثبيت وإنشاء مجموعة من أسماء الملفات المعالجة، اخترت العملية المذكورة أعلاه كما كنت ترغب في أن تكون قادرا على تحديد أي من مواد تركيباتك العديدة الموجودة التي أتمنى أن تقوم بها DB.

أتساءل الحاجة إلى كتابة اختبار من هذا القبيل في المقام الأول. هل تختبر أن مهمة أشعل النار في بيانات البذور تعمل بشكل صحيح أو هل ترغب في اختبار سلوك تنفيذك من فئة الدولة؟ أفترض الأخير، لذلك أود أن أكتب الاختبارات التي تركز على السلوك واستخدام فتاة المصنع (أو ما شابه) منذ أن ذكرت أنك لا تستخدم تركيباتها. تأكد من إزالة fixtures :all خط من test/test_helper.rb.

لحقن مهمة في التدفق الطبيعي لتشغيل الاختبارات، وهذا هو نهج يعمل دائما بالنسبة لي:

namespace :test do
  task :force_environment do
    ENV['RAILS_ENV'] = 'test'
    RAILS_ENV.replace('test')
  end
end

%w(test:units test:functionals test:integration).map do |task_name|
  task = Rake::Task[task_name]
  task.clear_prerequisites

  task.enhance %w(db:test:prepare test:force_environment db:seed)
end

فقط ضع ذلك في ملف يسمى lib/tasks/testing.rake وسوف يتم التقاطها عند التشغيل التالي rake test أو غيرها من المهمة المتعلقة بالاختبار.

كان لدي نفس المشكلة، لكن الإجابة القياسية لم تنجح بالنسبة لي.

مشكلتي تشمل الأماكن في ملفات الفصل التي قامت ببحث قواعد البيانات عن الثوابت واستبعد named_scopes. لم أجد أي طريقة للحصول على بيانات البذور المحملة في الوقت المناسب.

لقد وجدت طريقة لتمرير الحذف، والتي كانت تحدث على الرغم من أنني قد حذفت ملف المباراة الخاص بي للجدول المفقود.

Rails_Env = اختبار أشعل النار DB: Reed Ruby - اختبار / وحدات / *. RB

لا يمكنك تطبيق كليهما seed و fixtures لإعداد نفسه tableالبيانات افتراضيا.

على سبيل المثال إذا قمت بإعداد تركيبات اسمه products.yml, ، سوف "حذف البيانات من المنتجات" أثناء إنشاء fixtures.

يمكنك:

  1. حرك ال seedمرحلة وراء fixturesS (تحميل البذور يدويا)؛
  2. استخدم أحدهم فقط، أو نهج بديل لإدارة بيانات الاختبار؛
  3. لا تستخدم كل من النهج لإعداد بيانات نفس الجدول؛
  4. في Rails4.2، يمكنك اختراق هذا خط في الخاص بك test_helper.rbمثله:

>

require 'rails/test_help'

class ActiveRecord::FixtureSet
  def self.create_fixtures(fixtures_directory, fixture_set_names, class_names = {}, config = ActiveRecord::Base)
    ...
    # table_rows.each_key do |table|
    #   conn.delete "DELETE FROM #{conn.quote_table_name(table)}", 'Fixture Delete'
    # end
    ...
  end

هذا من شأنه أن يساعد في بعض القضية القديمة، ولكن العبث seeds و fixtures يصل قد يجلب مشاكل جديدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top