在FactoryGirl中创建一个值数组,每个值都是唯一的



我已经定义了这个工厂:

factory :post, :parent => :post_without_countries, class: Post do |p|
       p.country_ids {|country_ids| [country_ids.association(:country), country_ids.association(:country)]} 
end

,我希望它能输出两个独特的国家。相反,它只是插入了与协会两次的同一国家:

#<Post id: nil, title: "Atque id dolorum consequatur.", body: "Praesentium saepe ullam magnam. Voluptatum tempora ...", created_at: nil, updated_at: nil, user_id: 1>
[#<Country id: 1, name: "Dominican Republic", isocode: "lyb", created_at: "2012-10-20 13:52:18", updated_at: "2012-10-20 13:52:18">, #<Country id: 1, name: "Dominican Republic", isocode: "lyb", created_at: "2012-10-20 13:52:18", updated_at: "2012-10-20 13:52:18">]

有什么想法?

更好地使用build_listcreate_list方法:

post.countries = create_list(:country, 2)

而不是做:

2.times { post.countries << FactoryGirl.create(:country) }

在RSPEC中,您可以制作一个after_create钩子:

after_create do |post|
  2.times { post.countries << FactoryGirl.create(:country) }
end

如果您需要自定义要创建一个国家的次数,则可以制作瞬态属性:

#in the post factory definition
ignore do
  num_countries 0 #default to zero
end
#different after_create
after_create do |post, proxy|
  proxy.num_countries.times { post.countries << FactoryGirl.create(:country) }
end

看起来工厂女孩可能无法正确迭代。我想到的两个问题是。

当您打算使用FactoryGirl.create时,您是否在使用FactoryGirl.build

您是否尝试用p.sequence(:country_ids)替换p.country_ids

我希望那些指向正确的方向。如果没有,也许更多信息?

好吧,我通过将我的许多国家的关系创建出工厂的关系并在RSPEC中创建它来解决此问题:

  post = FactoryGirl.build(:post)
  2.times { post.countries << FactoryGirl.create(:country) }

最新更新