工厂女孩与三个对象的关联

时间:2013-01-28 23:23:23

标签: ruby-on-rails factory-bot

我有一个包含表单字段的表单对象(通过外键form_id)

表单有很多form_fields。

还有与form_fields相关联的form_field_labels(通过外键field_id)

form_field有一个form_field_label。

我正在尝试建立一些基本工厂,以便我可以测试我的表格,方法和验证。

这是我到目前为止所做的:

FactoryGirl.define do
factory :default_form , class: Form do
    form_name "Default Form"
    form_url "default"
    enctype "multipart/form-data"
    form_type ""
    form_layout "1_column" 
    group_id 0
    response_fields "photo,first_name,last_name"
    default_form 0 
    language "en"
    submit_button_text "Submit" 
    reset_button_text "Reset" 
    default_dropdown_text "Please Select" 
    sort 0 
    default_status "NEW"
    apply_flag false
    require_advisory false
    add_button_text "Add Another Applicant"
    follows_group_default false

    factory :default_form_with_fields do
      ignore do
                form_fields_count 5
                form_field_labels_count 5
      end

      after(:create) do |form, evaluator|
                FactoryGirl.create_list(:form_field, evaluator.form_fields_count, form: form)
              end
    end
end 
end

我从FactoryGirl github页面复制了create_list函数,并且不知道我的测试用例是否有必要,我只想拥有一个基本Form-> form_fields-> form_field_label关系的工厂。

after createblock似乎可以正确设置我的默认表单字段。问题是我需要每个form_field都有一个关联的form_field_label。

在我们的架构中,没有form_field_label就没有form_field。

我是工厂女孩的新手,并且想建立至少这些基本关联,这样每当我有一个表单时,它会自动创建一些测试form_fields(通过工厂女孩)和一些测试form_field_labels。

非常感谢任何帮助。

由于

1 个答案:

答案 0 :(得分:0)

如果你需要的只是新创建的表单在form_fieldsfield_label的关联中有一条记录,那么你真的不需要使用create_list。您可以在FactoryGirl.create回调中使用正常的after(:create)

我建议为所有三个对象创建工厂:表单,表单字段和表单字段标签。然后你可以使用回调把各个部分放在一起:

FactoryGirl.define do
  factory :form_field_label do
    # set form field label attributes (if any)
  end

  factory :form_field do
    # set form field attributes (if any)
    after(:create) do |form_field|
      FactoryGirl.create(:form_field_label, :form_field => form_field)
    end
  end

  factory :form do
    # set base attributes: form_name, etc.

    factory :form_with_fields do
      after(:create) do |form|
        FactoryGirl.create(:form_field, :form => form)
      end
    end
  end
end

这是未经测试的,但我认为它应该有效。如果您有任何问题,请告诉我。另请注意,如果您对这些关联有任何在线验证器,则需要对FactoryGirl.build使用略有不同的方法,请告诉我,我会解释。

参考:FactoryGirl and has_many associations