2010-04-19 144 views
22

我需要传递额外的参数给工厂女孩用于回调。像这样的东西(但更复杂的真正):工厂女孩的额外参数

Factory.define :blog do |blog| 
    blog.name "Blah" 

    blog.after_create do |blog| 
    blog.posts += sample_posts 
    blog.save! 
    end 
end 

,然后用像这样创建:

Factory.create(:blog, :sample_posts => [post1, post2]) 

任何想法怎么办呢?

回答

32

这是现在可能没有任何 “黑客” 由于临时属性(see comment on issue #49

例如:

FactoryGirl.define do 
    factory :user do 
    transient do 
     bar_extension false 
    end 
    name {"foo #{' bar' if bar_extension}"} 
    end 
end 

# Factory(:user).name = "foo" 
# Factory(:user, :bar_extension => true).name = "foo bar" 

对于工厂女孩版本< 5.0:

FactoryGirl.define do 
    factory :user do 
    ignore do 
     bar_extension false 
    end 
    name {"foo #{' bar' if bar_extension}"} 
    end 
end 

# Factory(:user).name = "foo" 
# Factory(:user, :bar_extension => true).name = "foo bar" 
+3

这里有用的一组文档,包括如何访问一个瞬态属性一个after_create或其他块:https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md – Hollownest 2012-05-01 18:13:46

+1

'忽略'已弃用。改用'transient'。 – 2015-03-18 19:10:40

+0

@JonathanTran非常感谢,我编辑了我的答案以反映变化! – wintersolutions 2015-03-19 10:34:55

2

一种选择是创建额外的帖子虚拟访问了after_create钩检查:

class Blog 
    has_many :posts 
    attr_accessible :name, :title, ... # DB columns 
    attr_accessor :sample_posts  # virtual column 
end 

Factory.define :blog do |blog| 
    blog.name 'Blah' 

    blog.after_create do |b| 
    b.posts += b.sample_posts 
    b.save! 
    end 
end 

Factory(:blog, :sample_posts => [post1, post2]) 
+0

在我的例子,将工作,我真正的情况是比较复杂的。此外,为了FactoryGirl的限制,我不喜欢污染模型。无论如何感谢:) – Pablo 2010-04-19 13:23:34

+1

你只需要在你的'测试'环境中污染模型。实际上,你可以在'factories.rb'中执行它。 – 2010-04-19 16:33:14

+0

哦!当然,公开课:) – Pablo 2010-04-20 10:17:11

1

另一种选择是使用build代替create并添加:autosave到集合:

class Blog 
    has_many :posts, :autosave => true 
end 

Factory.define :blog do |blog| 
    blog.name 'Blah' 
    blog.posts { |_| [Factory.build(:post)] } 
end 

Factory(:blog, :posts => [post1, post2]) 
#or 
Factory.build(:blog, :posts => [unsavedPost1, unsavedPost2]) 
1

如果你打开factorygirl文件里面的类,我建议这样做,就像

require "user" 
class User 
    attr :post_count 
end 

让你打开类,而不是覆盖它