Używam Ruby on Rails 4 i rspec-rails gem 2.14. W przypadku mojego obiektu chciałbym porównać bieżący czas z updated_at
atrybutem obiektu po uruchomieniu akcji kontrolera, ale mam kłopoty, ponieważ specyfikacja nie spełnia wymagań. To znaczy, biorąc pod uwagę poniższy kod specyfikacji:
it "updates updated_at attribute" do
Timecop.freeze
patch :update
@article.reload
expect(@article.updated_at).to eq(Time.now)
end
Po uruchomieniu powyższej specyfikacji pojawia się następujący błąd:
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 ==)
Jak mogę sprawić, by specyfikacja przeszła?
Uwaga : próbowałem również następujących (zwróć uwagę na utc
dodatek):
it "updates updated_at attribute" do
Timecop.freeze
patch :update
@article.reload
expect(@article.updated_at.utc).to eq(Time.now)
end
ale specyfikacja nadal nie spełnia warunków (zwróć uwagę na różnicę wartości „otrzymano”):
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 ==)
===
zamiast ==
- obecnie porównujesz object_id dwóch różnych obiektów Time. Chociaż Timecop nie zamraża czasu serwera bazy danych. . . więc jeśli twoje znaczniki czasu są generowane przez RDBMS, to nie zadziała (spodziewam się, że nie stanowi to dla ciebie problemu)
===
, ale może to ucierpieć z powodu przekroczenia drugich granic. Prawdopodobnie najlepiej jest znaleźć lub napisać własny matcher, w którym przeliczasz na sekundy epoki i dopuszczasz niewielką absolutną różnicę.