Estoy usando Ruby on Rails 4 y la gema rspec-rails 2.14. Para mi objeto, me gustaría comparar la hora actual con el updated_at
atributo del objeto después de ejecutar una acción del controlador, pero estoy en problemas porque la especificación no pasa. Es decir, dado lo siguiente es el código de especificación:
it "updates updated_at attribute" do
Timecop.freeze
patch :update
@article.reload
expect(@article.updated_at).to eq(Time.now)
end
Cuando ejecuto la especificación anterior, obtengo el siguiente error:
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 ==)
¿Cómo puedo aprobar la especificación?
Nota : probé también lo siguiente (tenga en cuenta la utc
adición):
it "updates updated_at attribute" do
Timecop.freeze
patch :update
@article.reload
expect(@article.updated_at.utc).to eq(Time.now)
end
pero la especificación aún no pasa (tenga en cuenta la diferencia de valor "obtenido"):
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 ==)
===
lugar de ==
- actualmente está comparando el object_id de dos objetos Time diferentes. Aunque Timecop no congelará el tiempo del servidor de la base de datos. . . así que si sus marcas de tiempo las genera el RDBMS, no funcionaría (aunque espero que no sea un problema para usted)
===
, pero eso puede sufrir al cruzar segundos límites. Probablemente lo mejor sea encontrar o escribir su propio comparador, en el que convierta a segundos de época y permita una pequeña diferencia absoluta.