2013-05-05 2 views
4

나는 건조하기를 원하는 공장이 3 곳있다. 그들은 다음과 같이 보입니다 :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

Factory Girl transient attributes에서 찾을 수 있습니까? –

+0

나는 x 개의 Stamp-objects를 원한다. 그리고 : day_date의 날짜는 주, 년, 또는 달의 x 분량이어야한다. –

답변

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) 

하는 기본값 년.

이 모든 당신은 당신이 원하는 결과를 설명 할 수

+4

구문이 '무시할 것'대신에 '일시적으로'업데이트되었습니다. 매력처럼 작동합니다. – Sasha

+0

나는'do do do '를 사용해야했다. 'factory_girl 4.4.0'에 있습니다. – Kelly

+0

나를 위해,이 대답은 너무 많이 설명했다. 그래서 간단하게, 나는 당신에게 다른 대답에 여분의 '+1'을 주어야했다. :) –

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

감사합니다. 이것은 분명히 좋지만, 주, 월 또는 년을 매개 변수로 설정할 수있는 방법이 있습니까? 그래서 나는 단지 세 가지 대신 하나의 다이나믹 팩토리를 만들 수 있습니까? –

+0

매개 변수를 사용하는 또 다른 응답이 추가되었습니다. – boulder

관련 문제