FactoryGirl在工厂中设置updated_at属性

时间:2016-09-30 03:42:40

标签: ruby-on-rails-4 testing rspec factory-bot

使用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

如何让它发挥作用?

4 个答案:

答案 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 } 也无济于事。