使用FactoryGirl 4.7.0,我有一个工厂,我想将updated_at属性指定为过去的日期。
$('.bank.cur').click(function(event) {
event.preventDefault();
var $target = $(event.target);
var $li = $target.parent();
var bank = $li.data('name');
// now do something with the value of 'var bank'
});
然而这些都不起作用。工厂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
。
如何让它发挥作用?
答案 0 :(得分: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 gem
答案 1 :(得分:0)
原来我必须在工厂创建时使用回调,就像这样
Date.now
答案 2 :(得分:0)
你几乎就在那里,但你需要保存并跳过验证/回调,这应该after :create
完成,如下所示:
trait :expired do
after :create do |living_arrangement|
living_arrangement.update_columns(updated_at: 2.months.ago)
end
end
答案 3 :(得分:0)
我在回调中使用了 trait
和数据库更新
trait :future do
after :create do |model|
model.update(updated_at: Time.now + 1.minutes)
end
end
我尝试了 David Milanese 为 updated_at
赋值的方法,但 updated_at
没有持续存在。
我在 after :build
回调中重试了此方法,但效果不佳。
我尝试过使用序列,即 updated_at { Time.now + 1.minute }
也无济于事。