Я використовую Ruby on Rails 4 і rspec-rails gem 2.14. Для мого об'єкта я хотів би порівняти поточний час з 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
але специфікація все ще не проходить (зверніть увагу на різницю "got"):
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 не заморозить час сервера бази даних. . . тому, якщо ваші часові позначки створюються RDBMS, це не спрацює (я думаю, це для вас тут не проблема)
===
, але це може страждати від перетину другої межі. Напевно, найкраще - знайти або написати власний матч, в якому ви перетворюєтесь на епохальні секунди і допускаєте невелику абсолютну різницю.