我已经将模型中复杂的一系列模型的创建移到了一个表单对象中,但在删除一些钩子时,我设法打破了一些测试。
问题是我的工厂创建模型并依赖于运行的钩子。这里显而易见的解决方案是更改工厂以便它分配给表单对象,但这会返回表单对象的实例,因此我需要更新我已经破坏的每个测试。有没有办法让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。如果我弄清楚如何做,我会回答我自己的问题;目前它没有做正确的协会,但似乎确实正确地创建了一个项目。
答案 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