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

は、私はActiveRecordのの自動タイムスタンプ機能が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 

または複数の工場のようなスペックはあなたにこのヘルパーを使用することができ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 

ザ・を作成することができますTimeCop gem

0

あなたはほとんど存在していますが、 dが保存および検証/コールバックをスキップし、それはそうのように、after :createを実行する必要がありますします

trait :expired do 
    after :create do |living_arrangement| 
    living_arrangement.update_columns(updated_at: 2.months.ago) 
    end 
end 
関連する問題