سؤال

هل يمكن لأي شخص أن يقترح طريقة أفضل لجعل المصنع يستخدم مثالا نموذجيا مسبقا لجمعيته؟ على سبيل المثال، حتى يكون ذلك ممكنا أدناه لتحديد طفل من مصنع الرسالة بحيث دعوة إلىFactory(:my_message) يمكن أن يكون بديلا عن.Factory(:message,:sender=>@me) ?

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

بديل واحد يمكنني التفكير فيه هو تحديد طريقة مساعد اختبار مثل create_message_owned_by(@me), ، لكنني آمل أن تكون هناك طريقة داخل factory_girl نفسها.

مصانع Factory_Girl:

Factory.define :sender do |s|
  sender.name "Dummy name"
end

Factory.define :message do |msg|
  msg.text "Dummy text"
  msg.association :sender
end

Factory.define :my_message, :parent=>:message do |msg|
  msg.text "Dummy text"
  ### ? what goes here for msg.association :sender ? ###
end

ExcherationControllertest مقتطف (باستخدام يجب):

context "on GET /messages" do
  setup do
    @me = Factory(:sender)
    @my_message = Factory(:message,:sender=>@me)
    @somebody_elses_message = Factory(:message)
    sign_in_as(@me)
    get :index
  end
  should "only assign my messages" do
    assert_contains(assigns(:messages), @my_message)
    assert_does_not_contain(assigns(:messages), @somebody_elses_message)
  end
end
هل كانت مفيدة؟

المحلول

لا أعرف إذا كان هذا هو ما تبحث عنه، ولكن إذا قمت أولا بإنشاء رسالة، فيمكنك جلب المرسل عبر ذلك وتعيينه @me.

@my_message = Factory(:message)
@me = @my_message.sender

هل هذا يساعد على الإطلاق؟

نصائح أخرى

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

أنظر أيضا هذا السؤال و هذا الموضوع من قائمة Factory_Girl البريدية.

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