2010-04-19 143 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 

讓你打開類,而不是覆蓋它