FactoryGirl定义一个必须至少有一个其他对象的对象

时间:2013-11-29 17:37:04

标签: ruby-on-rails rspec factory-bot

我有两个模型ProjectProjectImageproject必须至少有一个project_image才有效。这在我的应用程序中设置得很好但是在测试时,我不确定如何处理它。

我有我的项目工厂:

factory :project do
  title { Faker::Lorem.word(5) }
  intro { Faker::Lorem.word(5) }

  association :user, factory: :user
end

我的project_image工厂。

factory :project_image do
  image { File.open(Dir.glob(File.join(Rails.root, 'sampleimages/projects', '*')).sample) }

  association :project, factory: :project
  association :user, factory: :user
end

显然,我的项目工厂无效,因为它需要至少有一个图像。所以我认为它需要一个关联,但是,这只会创建一个循环依赖。它们彼此依赖,所以我确定如何创造一个没有另一个。

1 个答案:

答案 0 :(得分:1)

我认为你可以通过这种方式破解它

factory :project do
  title { Faker::Lorem.word(5) }
  intro { Faker::Lorem.word(5) }

  association :user, factory: :user

  after(:build) do |project|
    FactoryGirl.build(:project_image, project: project)
  end
end

PS你可以更容易地定义工厂

factory :project_image do
  image { File.open(Dir.glob(File.join(Rails.root, 'sampleimages/projects', '*')).sample) }

  project
  user
end

PPS如果直接回答您的问题

  

所以我认为它需要一个关联,但是,这只会创建一个循环依赖

您可以将属性传递给工厂,它将使用它而不是您在文件工厂中定义的属性。示例:您需要一个包含3张图片的项目

project = FactoryGirl.create(:project) # this project has one picture created in factory
FactoryGirl.create_list(:project_image, 2, project: project) # this will create two pictures for existed project

project.reload # you need update local varial to fetch new records from DB
project.project_images.size # => 3