Sto usando Ruby su Rails 4 e rspec-rails gem 2.14. Per un oggetto my vorrei confrontare l'ora corrente con l' updated_at
attributo object dopo l'esecuzione di un'azione del controller, ma sono nei guai poiché la specifica non viene superata. Cioè, dato quanto segue è il codice delle specifiche:
it "updates updated_at attribute" do
Timecop.freeze
patch :update
@article.reload
expect(@article.updated_at).to eq(Time.now)
end
Quando eseguo la specifica sopra, ottengo il seguente errore:
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 ==)
Come posso far passare la specifica?
Nota : ho provato anche quanto segue (nota il fileutc
aggiunta):
it "updates updated_at attribute" do
Timecop.freeze
patch :update
@article.reload
expect(@article.updated_at.utc).to eq(Time.now)
end
ma la specifica continua a non essere soddisfatta (nota la differenza di valore "ottenuto"):
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 ==)
===
invece di ==
- attualmente stai confrontando object_id di due diversi oggetti Time. Anche se Timecop non bloccherà l'ora del server del database. . . quindi se i tuoi timestamp vengono generati dall'RDBMS non funzionerebbe (mi aspetto che non sia un problema per te qui però)
===
, ma potresti soffrire di attraversare i secondi confini. Probabilmente la cosa migliore è trovare o scrivere il proprio matcher, in cui si converte in epoche secondi e si tiene conto di una piccola differenza assoluta.