0

我有一个具有表单字段的表单对象(通过外键 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。

任何帮助将不胜感激。

谢谢

4

1 回答 1

0

如果您只需要新创建的表单在与 a 的form_fields关联中有一条记录field_label,那么您实际上不需要使用create_list. 您可以FactoryGirl.createafter(: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 和 has_many 关联

于 2013-01-29T00:17:13.303 回答