📅  最后修改于: 2023-12-03 15:26:57.250000             🧑  作者: Mango
在 Rails 中,测试通常需要夹具(fixtures)来提供初始数据。夹具是预定义的测试数据,保存为 YAML 文件,方便测试代码访问和使用。Rails 默认会给每个夹具添加一个时间戳字段,这通常不是我们所期望的。如果你希望使用没有时间戳的 Rails 夹具来测试你的 Rails 应用程序,下面的介绍可能会对你有帮助。
在 Rails 中,每个夹具都有一个 created_at
字段和一个 updated_at
字段。默认情况下,夹具的时间戳是从当前时间自动生成的。这意味着,每次运行测试时,夹具的时间戳都会改变。因此,在你的测试代码中应用这些夹具时,会发现测试结果不一致,这大大降低了测试的可靠性。
要创建没有时间戳的 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_at
和 updated_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_at
和 updated_at
字段,并使用 ERB 模板引擎来计算实际时间戳,这样就可以保证测试结果一致了。
尽管 Rails 默认会为夹具添加时间戳,但是在某些情况下,这样的时间戳不是很有用。如果你需要对没有时间戳的夹具执行测试,你需要快速地手动添加 created_at
和 updated_at
字段。通过这种方式,你可以保证测试结果一致,而不会由于时间问题产生问题。