📜  没有时间戳的 rails 夹具 (1)

📅  最后修改于: 2023-12-03 15:26:57.250000             🧑  作者: Mango

没有时间戳的 Rails 夹具

在 Rails 中,测试通常需要夹具(fixtures)来提供初始数据。夹具是预定义的测试数据,保存为 YAML 文件,方便测试代码访问和使用。Rails 默认会给每个夹具添加一个时间戳字段,这通常不是我们所期望的。如果你希望使用没有时间戳的 Rails 夹具来测试你的 Rails 应用程序,下面的介绍可能会对你有帮助。

为什么需要没有时间戳的 Rails 夹具?

在 Rails 中,每个夹具都有一个 created_at 字段和一个 updated_at 字段。默认情况下,夹具的时间戳是从当前时间自动生成的。这意味着,每次运行测试时,夹具的时间戳都会改变。因此,在你的测试代码中应用这些夹具时,会发现测试结果不一致,这大大降低了测试的可靠性。

如何创建没有时间戳的 Rails 夹具?

要创建没有时间戳的 Rails 夹具,首先需要在 test_helper.rb 文件中添加代码:

class ActiveSupport::TestCase
  ActiveRecord::FixtureSet.context_class.send :include, NoTimestamps
end

module NoTimestamps
  def before_setup
    ActiveRecord::Base.record_timestamps = false
    super
  end

  def after_teardown
    super
    ActiveRecord::Base.record_timestamps = true
  end
end

然后,你需要重新定义你的夹具 YAML 文件,在 YAML 文件中手动添加 created_atupdated_at 字段:

# fixtures/users.yml
one:
  name: Alice
  created_at: <%= 3.days.ago.utc.to_s(:db) %>
  updated_at: <%= 2.days.ago.utc.to_s(:db) %>

two:
  name: Bob
  created_at: <%= 2.days.ago.utc.to_s(:db) %>
  updated_at: <%= 1.day.ago.utc.to_s(:db) %>

three:
  name: Charlie
  created_at: <%= 1.day.ago.utc.to_s(:db) %>
  updated_at: <%= Time.now.utc.to_s(:db) %>

注意,我们在夹具文件中手动添加了 created_atupdated_at 字段,并使用 ERB 模板引擎来计算实际时间戳,这样就可以保证测试结果一致了。

结论

尽管 Rails 默认会为夹具添加时间戳,但是在某些情况下,这样的时间戳不是很有用。如果你需要对没有时间戳的夹具执行测试,你需要快速地手动添加 created_atupdated_at 字段。通过这种方式,你可以保证测试结果一致,而不会由于时间问题产生问题。