Estou usando Ruby on Rails 4 e rspec-rails gem 2.14. Para um meu objeto, gostaria de comparar a hora atual com o updated_at
atributo do objeto após a execução de uma ação do controlador, mas estou com problemas porque a especificação não passa. Ou seja, dado o seguinte está o código de especificação:
it "updates updated_at attribute" do
Timecop.freeze
patch :update
@article.reload
expect(@article.updated_at).to eq(Time.now)
end
Quando executo a especificação acima, recebo o seguinte erro:
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 ==)
Como posso fazer a especificação passar?
Observação : tentei também o seguinte (observe a utc
adição):
it "updates updated_at attribute" do
Timecop.freeze
patch :update
@article.reload
expect(@article.updated_at.utc).to eq(Time.now)
end
mas a especificação ainda não passa (observe a diferença de valor "obtido"):
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 ==)
===
vez de ==
- atualmente você está comparando o object_id de dois objetos Time diferentes. Embora o Timecop não congele o tempo do servidor do banco de dados. . . então, se seus carimbos de data / hora estiverem sendo gerados pelo RDBMS, não funcionaria (espero que isso não seja um problema para você aqui)
===
, mas isso pode sofrer ao cruzar limites secundários. Provavelmente, o melhor é encontrar ou escrever seu próprio matcher, no qual você converte para segundos de época e permite uma pequena diferença absoluta.