2016-09-30 5 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 

그러나 이들은 작동하지 않습니다. factory updated_at 속성은 Date.now으로 다시 설정됩니다.

어떻게 작동합니까?

+0

을 나는이 오래 전 알고있다! 이 답변들 중 어떤 것이 도움이 되었습니까? 비슷한 문제가 있습니다. – jordancooperman

+0

제가 사용했던 대답을 선택했습니다. –

답변

0

내가 액티브의 자동 타임 스탬프 기능 FactoryGiril 값을 무시 Time.nowcreated_at and updated_at에 대한 필드를 설정 때문에

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의 기본 동작입니다. 다행히도 그것은

LivingArrangement.record_timestamps = false

기회와 함께 사용할 수있는 사용자 정의 타임 스탬프 모델을 생성 한 후에는 다시 자동으로 타임 스탬프를 설정 할 것이라는 점이다. 하지만 단위 테스트에서 여러 곳에서이를 켜고 끄는 것은 꽤 귀찮은 일입니다. 사용

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 

또 다른 일반적인 접근 방법이 될 것이다 당신은 당신이

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

또는 여러 공장처럼 사양이 도우미를 사용할 수있는이

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 

등 뭔가를 test_helper를 만들 수 있습니다 TimeCop 보석

0

거의 다 왔지만 그렇지 않습니다. d를 저장하고 검증/콜백을 건너 뛰고 그과 같이, after :create을 수행해야합니다 :

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