Я использую Ruby on Rails 4 и гем 2.14 rspec-rails. Для своего объекта я хотел бы сравнить текущее время с updated_at
атрибутом объекта после выполнения действия контроллера, но у меня проблемы, поскольку спецификация не проходит. То есть, учитывая следующий код спецификации:
it "updates updated_at attribute" do
Timecop.freeze
patch :update
@article.reload
expect(@article.updated_at).to eq(Time.now)
end
Когда я запускаю указанную выше спецификацию, я получаю следующую ошибку:
Failure/Error: expect(@article.updated_at).to eq(Time.now)
expected: 2013-12-05 14:42:20 UTC
got: Thu, 05 Dec 2013 08:42:20 CST -06:00
(compared using ==)
Как я могу добиться соответствия спецификации?
Примечание : я пробовал также следующее (обратите внимание на utc
добавление):
it "updates updated_at attribute" do
Timecop.freeze
patch :update
@article.reload
expect(@article.updated_at.utc).to eq(Time.now)
end
но спецификация по-прежнему не проходит (обратите внимание на разницу в значениях "получено"):
Failure/Error: expect(@article.updated_at.utc).to eq(Time.now)
expected: 2013-12-05 14:42:20 UTC
got: 2013-12-05 14:42:20 UTC
(compared using ==)
===
вместо ==
- в настоящее время вы сравниваете object_id двух разных объектов Time. Хотя Timecop не заморозит время сервера базы данных. , , поэтому, если ваши временные метки генерируются РСУБД, это не сработает (хотя я думаю, что это не проблема для вас)
===
, но это может пострадать от пересечения вторых границ. Вероятно, лучше всего найти или написать свой собственный сопоставитель, в котором вы конвертируете в секунды эпохи и допускаете небольшую абсолютную разницу.