3

使用 Rails3,令人敬畏的 FactoryGirl gem 有一个方法 create_list,它接受一个策略、多次,然后是一个值的哈希值传递到策略中。(从https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md复制)

twenty_year_olds = FactoryGirl.create_list(:user, 25, date_of_birth: 20.years.ago)

假设我不想传递“20.years.ago”,而是传递一个 lambda(或 Proc),每次读取该变量时都会执行一次。这在 Ruby 或 FactoryGirl 中是否可行,或者 FactoryGirl 是否必须检查每个参数以查看它是否是 lambda。

dob_dynamic = -> { random_dob some_param }
twenty_year_olds = FactoryGirl.create_list(:user, 25, date_of_birth: dob_dynamic )

当我做这样的事情时,我得到了:

 raise ActiveRecord::AssociationTypeMismatch, message, Object expected, got Proc

我通过执行以下操作解决了这个问题:

  # pass i, b/c times always passes index to proc
  # dob_dynamic.() invokes dob_dynamic
  create_user = -> i { create :user, date_of_birth: dob_dynamic.() }
  25.times &create_user

有没有更好的方法来做到这一点?

4

2 回答 2

0

根据我对您的了解,您应该能够创建一个新工厂(可能使用工厂继承或特征)并将随机代码放入该工厂。如果您在工厂中使用块,每次都会重新评估它,因此您可以轻松使用 create_list。

于 2012-10-08T05:36:47.000 回答
0

我发布了 create_list 的功能请求以支持获取 proc。暂时 after(:create) 的钩子非常适合这样的代码,如原始发布的那样:

# pass i, b/c times always passes index to proc
# dob_dynamic.() invokes dob_dynamic
create_user = -> i { create :user, date_of_birth: dob_dynamic.() }
25.times &create_user
于 2013-01-11T20:35:58.983 回答