【问题标题】:FactoryGirl set updated_at attribute in factoryFactoryGirl 在工厂设置 updated_at 属性
【发布时间】:2016-09-30 03:42:40
【问题描述】:

使用 FactoryGirl 4.7.0,我有一个工厂,我想将 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

如何让它工作?

【问题讨论】:

  • 我知道这是很久以前的事了!这些答案中的任何一个最终有帮助吗?我遇到了类似的问题。
  • 我已经选择了我使用的答案。

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


【解决方案1】:

原来我必须在工厂创建时使用回调,就像这样

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

【讨论】:

  • 我认为这不会保存updated_at的新值。
  • 是的,您可能更喜欢living.touch 之类的东西来重置updated_at。但我发现 dixpac 的回答对我来说确实很有效
  • 虽然使用Timecop(正如 dixpac 提到的那样)似乎是一种更简单、更清洁的方式
【解决方案2】:

ActiveRecord 的自动时间戳功能集 Time.now 用于覆盖 FactoryGiril 值的 created_at and updated_at 字段。这是 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

【讨论】:

    【解决方案3】:

    您快到了,但您需要保存并跳过验证/回调,这应该完成after :create,如下所示:

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

    【讨论】:

      猜你喜欢
      • 2021-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多