2016-09-30 76 views
0

使用FactoryGirl 4.7.0,我有一個工廠,我想將updated_at屬性指定爲過去的日期。FactoryGirl在工廠中設置updated_at屬性

factory :living_arrangement do 

    trait :expired do 
     updated_at Date.new(2012, 3, 6) 
     # or 
     updated_at { Date.new(2012, 3, 6) } 
    end 
end 

但是,這些不起作用。工廠updated_at屬性始終設置爲Date.now

我如何得到這個工作?

+0

我知道這是很久以前的事了!這些答案中的任何一個最終幫助?我遇到了類似的問題。 – jordancooperman

+0

我選擇了我使用的答案。 –

回答

0

原來我原來用的是工廠被創建時的回調,像這樣

factory :living_arrangement do 
    trait :expired do 
     after :create do |living| 
      living.updated_at = Date.new(2012, 3, 6) 
     end 
    end 
end 
+0

我認爲這不會保存'updated_at'的新值。 –

+0

是的,好像你可能更喜歡'living.touch'來重置updated_at。但我發現dixpac的答案對我來說效果不錯 – jordancooperman

+0

儘管使用[Timecop](https://github.com/travisjeffery/timecop)(正如dixpac提到的)似乎是一種更簡單更清晰的方式 – jordancooperman

1

的ActiveRecord的自動時間戳功能可設置爲Time.now領域created_at and updated_at覆蓋FactoryGiril值。這是ActiveRecord的默認行爲。幸運的是它可以與

LivingArrangement.record_timestamps = false

機會被禁用是使用自定義時間戳創建模型後,你要關閉自動時間戳回。但是在你的單元測試中關閉和關閉許多地方會非常麻煩。你可以創建test_helper,像這樣

def without_timestamping_of(*klasses) 
    if block_given? 
     klasses.delete_if { |klass| !klass.record_timestamps } 
     klasses.each { |klass| klass.record_timestamps = false } 
     begin 
     yield 
     ensure 
     klasses.each { |klass| klass.record_timestamps = true } 
     end 
    end 
    end 

的,你可以使用這個助手在你規範這樣

without_timestamping_of LivingArrangement do 
    create(:living_arrangement, :created_at => 1.week.ago, :updated_at => 1.week.ago) 
end 

或多個工廠

without_timestamping_of LivingArrangement, User do 
    create(:living_arrangement, :created_at => 1.week.ago, :updated_at => 1.week.ago) 
    create(:user, :created_at => 1.week.ago, :updated_at => 1.week.ago) 
end 

另一種常見的方法是使用TimeCop寶石

0

你幾乎在那裏,但你需要d保存並跳過驗證/回調,並且應該完成after :create,如下所示:

trait :expired do 
    after :create do |living_arrangement| 
    living_arrangement.update_columns(updated_at: 2.months.ago) 
    end 
end 
相關問題