2013-05-05 42 views
4

我有三個工廠,我想幹起來。他們看起來像這樣:FactoryGirl:使用參數創建動態工廠?

factory :sequenced_stamps_by_years, class: Stamp do 
    ... 
    sequence(:day_date) { |n| n.years.ago } 
end 

factory :sequenced_stamps_by_months, class: Stamp do 
    ... 
    sequence(:day_date) { |n| n.months.ago } 
end 

factory :sequenced_stamps_by_weeks, class: Stamp do 
    ... 
    sequence(:day_date) { |n| n.weeks.ago } 
end 

我該如何幹燥呢?我想要能夠創建他們這樣的事情:

FactoryGirl.create_list(:sequenced_stamps_by_x, 4, x: "weeks") ## <- So that i can decide whether I want weeks, days, years, or months ago. 

這可能嗎?

+0

你能描述你想要的輸出嗎? – 2013-05-05 13:47:12

+0

我想要x數量的印記對象,以及:day_date的日期應該是x週數,數年或數月。 – 2013-05-05 13:56:32

回答

10

如果您不贊成繼承方式,則可以使用參數進行替代。基本上是:

factory :stamps do 
    ignore do 
    interval :years # possible values => :years, :months, :weeks 
    end 

    sequence(:date_date) { |n| n.send(interval).ago } 

    # rest of attributes here 
end 

現在你可以這樣做:

FactoryGirl.create(:stamps, :interval => :months) 

FactoryGirl.create(:stamps) 

默認爲年。

所有這些你可以在Factory Girl transient attributes

+4

看起來語法已經更新爲'transient do'而不是'ignore do'。奇蹟般有效。 – Sasha 2015-04-17 18:37:06

+0

我仍然不得不使用'ignore do'。在'factory_girl 4.4.0'上。 – Kelly 2015-09-22 13:35:32

+0

對我來說,這個答案解釋如此之多,簡單地說,我不得不在另一個答案上給你一個額外的'+1':) – 2017-08-15 21:54:17

1

工廠可以從其他工廠繼承。因此,您可以執行如下操作:

factory :stamps do 
    # common attributes here 
    ..... 

    factory: sequenced_stamps_by_years do 
    sequence(:day_date) { |n| n.years.ago } 
    end 
    factory: sequenced_stamps_by_months do 
    sequence(:day_date) { |n| n.months.ago } 
    end 
    factory: sequenced_stamps_by_weeks do 
    sequence(:day_date) { |n| n.weeks.ago } 
    end 
end 
+0

謝謝!這絕對會更好,但是有沒有辦法將周,月或年設置爲參數?所以我可以創建一個動態工廠而不是三個? – 2013-05-05 13:58:12

+0

增加了另一個使用參數的響應 – boulder 2013-05-06 12:58:36