将表单对象与 FactoryGirl 一起使用

Using Form Objects with FactoryGirl

我已经将一系列复杂模型的创建从模型中移出到表单对象中,但是在删除一些挂钩时我设法破坏了一些测试。

问题是我的工厂创建模型并依赖于挂钩 运行。这里明显的解决方案是更改工厂,以便它分配给表单对象,但是这个 return 是表单对象的一个​​实例,需要我更新我破坏的每个测试。有没有办法让 FactoryGirl 使用表单对象创建模型,然后 return 它构建的对象的 属性 (具体来说, 属性 就是组装好的模型)?

这是当前工厂 - 表单对象使用相同的字段名称:

factory :project do
    status "Project active"
    association :director, factory: :employee
    association :manager, factory: :employee

    category { Settings.project.categories.billable.first }
    estimated_completion_date { Date.current }
    estimated_project_start_date { Date.current }
    name { Faker::Lorem.words.join(' ') }
    likelihood { Settings.project.likelihoods.first }
    project_type { Settings.project.types.first }
    proposal_due_date { Date.current }
    proposal_verdict_date { Date.current }
    description { Faker::Lorem.paragraph }
    research_independence { Settings.project.research_independence.first }

    factory :unsuccessful_proposal do
        status "Proposal unsuccessful"
    end

    factory :proposal_submitted do
        proposal_submitted_date { Date.current }
        status "Proposal submitted"

        after(:build) do |proposal, evaluator|
            proposal.clients << build(:client)
        end
    end
end

编辑:我在圣诞节前问过这个问题,但很少有人关注它。我自己的研究表明我可以在工厂中使用 initialize_with 来创建我的表单对象,使用 to_create 来修改 FactoryGirl 的保存行为,并且我可以通过自定义构建策略直接影响 FactoryGirl。如果我弄清楚该怎么做,我会 return 回答我自己的问题;目前它没有正确地进行关联,但它似乎正在正确地创建一个项目。

所以在这得到风滚草之后,我做了自己的研究。解决方案:FactoryGirl 有一个名为initialize_with 的函数,可用于调用需要参数的initialize 函数。诀窍是 initialize_with 理解 attributes,它是您在工厂中定义的所有属性的散列。所以对于一个表单,你可以调用你的 new(attributes),运行 任何你需要的,然后最后 return 表单正在创建的一个或多个模型。

例如:

initialize_with do |result|
    form = ProjectForm.new(attributes)
    if form.save!
        result = form.project
    else
        result = form.errors
    end
end