将表单对象与 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
我已经将一系列复杂模型的创建从模型中移出到表单对象中,但是在删除一些挂钩时我设法破坏了一些测试。
问题是我的工厂创建模型并依赖于挂钩 运行。这里明显的解决方案是更改工厂,以便它分配给表单对象,但是这个 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