16

在工厂中,如何引用正在创建的对象中其他字段之一的值?

假设我的模型 Widget 有两个字段,nickname并且fullname

在我的工厂内部,我想在每次创建工厂时使用 Faker 创建一个不同的随机昵称。(终于想通了我必须使用sequence(:nickname),否则所有工厂的名字都是一样的。)

为了使一些断言更容易测试,我想生成一个基于昵称的全名,比如fullname = "Full name for #{nickname}"

FactoryGirl.define do
  factory :widget do 
    sequence(:nickname) { |n| Faker::Lorem.words(2).join(' ') }
    sequence(:fullname) { |n| "Full name for " + ????? }
  end
end

不管我放在哪里???去,我得到#<FactoryGirl::Decl...的不是昵称。

我尝试了 name、name.to_s、name.value ......似乎没有任何效果。

4

1 回答 1

20

是的。这是 Factory Girl 的入门文档中的一个示例:

factory :user do
  first_name "Joe"
  last_name  "Blow"
  email { "#{first_name}.#{last_name}@example.com".downcase }
end

FactoryGirl.create(:user, last_name: "Doe").email
# => "joe.doe@example.com"

另外,我通常分别定义我的序列,在config/application.rb

FactoryGirl.define do
  sequence(:random_string) { |s| ('a'..'z').to_a.shuffle[0, 30].join }
end

你可能会从做同样的事情中受益。然后你可能会做类似的事情:

FactoryGirl.define do
  factory :widget do 
    nickname generate(:name_faker) # assuming you had defined a :name_faker sequence
    fullname generate("Full name for #{nickname}")
  end
end
于 2012-10-07T01:35:12.787 回答