如何传递FactoryGirl方法的参数

时间:2013-12-27 11:22:55

标签: ruby-on-rails factory-bot

以下代码用于创建对象:

FactoryGirl.define do

  factory :user do
    name    'Some name'
    phone   '89277777777'
    address 'Some address'
  end

  factory :order do
    title   'Some title'
  end
end

用户模型已获得has_many :orders关联,是否可以将user工厂传递给order工厂?

提前致谢。

2 个答案:

答案 0 :(得分:1)

是,如下:

FactoryGirl.define do

  factory :user do
    name    'Some name'
    phone   '89277777777'
    address 'Some address'
  end

  factory :order do
    user
    title   'Some title'
  end
end

在您的规格中:

FactoryGirl.create(:order)

将创建订单对象和关联的用户对象。

有关FactoryGirl with Rails的更多信息 - https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md

答案 1 :(得分:0)

是的,解决方案就像使用关联方法一样简单

factory :order do
  title   'Some title'
  association :user
end

可以缩短为

factory :order do
  title   'Some title'
  user
end

一句警告。只要模型的复杂性增加,这种方法往往会使您的应用程序变得非常慢。

事实上,如果您购买了与用户关联的订单等相关联,那么即使您不需要购买,也会创建所有相关记录。你的测试会在一段时间内变慢。

我建议您仅在需要时才use the traits to compose your associations

factory :order do
  title   'Some title'

  trait :with_user do
    user
  end
end

FactoryGirl.create(:order, :with_user)

当我需要用户ID进行验证时,我通常也会使用:with_fake_user,但我正在测试一些不需要访问用户的内容。

factory :order do
  title   'Some title'

  trait :with_user do
    user
  end
  trait :with_fake_user do
    user_id 0
  end
end

FactoryGirl.create(:order, :with_user)
FactoryGirl.create(:order, :with_fake_user)