Rspec/FactoryGirl 测试订单 created_at
Rspec/FactoryGirl testing order by created_at
我正在尝试通过 created_at
测试订购系列。由于它是精确到秒的时间戳,当我创建 10 条记录时,它们具有相同的 created_at
值,这导致我的响应不一致。所以我在这里做的是像
一样手动设置 created_at
字段
5.times do |t|
create(:model, created_at: Time.current.advance(days: -1*(t+1))
end
它设置 created_at
就好了,但是当我设置
Model.all.order(created_at: :desc)
它只是忽略它并放入 ASC
顺序。
有什么方法可以测试这个订单吗?
谢谢
您提供的时间戳可能没有被保存,并且 Rails 在创建对象时使用了它自己的内部时间戳。你可以试试:
5.times do |t|
thing = create(:model)
thing.update_column(:created_at, Time.current.advance(days: -1*(t+1))
end
这将绕过对模型的任何验证,您应该保存正确的时间戳,然后您应该能够按预期对它们进行排序。
您可以通过将查询结果保存在变量 results
中进行测试,然后像这样:
expect(results[0].created_at < results[1].created_at).to be true
您可以尝试的另一件事是 YourModel.unscope.where(...).order(created_at: :desc)
。可能有一个您看不到的范围正在影响顺序。
我正在尝试通过 created_at
测试订购系列。由于它是精确到秒的时间戳,当我创建 10 条记录时,它们具有相同的 created_at
值,这导致我的响应不一致。所以我在这里做的是像
created_at
字段
5.times do |t|
create(:model, created_at: Time.current.advance(days: -1*(t+1))
end
它设置 created_at
就好了,但是当我设置
Model.all.order(created_at: :desc)
它只是忽略它并放入 ASC
顺序。
有什么方法可以测试这个订单吗?
谢谢
您提供的时间戳可能没有被保存,并且 Rails 在创建对象时使用了它自己的内部时间戳。你可以试试:
5.times do |t|
thing = create(:model)
thing.update_column(:created_at, Time.current.advance(days: -1*(t+1))
end
这将绕过对模型的任何验证,您应该保存正确的时间戳,然后您应该能够按预期对它们进行排序。
您可以通过将查询结果保存在变量 results
中进行测试,然后像这样:
expect(results[0].created_at < results[1].created_at).to be true
您可以尝试的另一件事是 YourModel.unscope.where(...).order(created_at: :desc)
。可能有一个您看不到的范围正在影响顺序。