在FactoryGirl中使用表单对象

时间:2016-12-15 00:28:36

标签: ruby-on-rails factory-bot

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

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

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

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。如果我弄清楚如何做,我会回答我自己的问题;目前它没有做正确的协会,但似乎确实正确地创建了一个项目。

1 个答案:

答案 0 :(得分:0)

所以在这次风滚草之后,我做了自己的研究。解决方案:FactoryGirl有一个名为initialize_with的函数,可用于调用需要参数的initialize函数。诀窍是initialize_with了解attributes,这是您在工厂中定义的所有属性的哈希值。因此,对于表单,您可以调用新的(属性),运行您需要的任何其他内容,然后最终返回表单正在创建的模型。

例如:

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