Ich benutze Ruby on Rails 4 und das rspec-Rails Gem 2.14. Für ein mein Objekt möchte ich die aktuelle Zeit mit dem updated_at
Objektattribut nach einem Controller-Aktionslauf vergleichen, aber ich habe Probleme, da die Spezifikation nicht bestanden wird. Das heißt, wenn der folgende Spezifikationscode angegeben ist:
it "updates updated_at attribute" do
Timecop.freeze
patch :update
@article.reload
expect(@article.updated_at).to eq(Time.now)
end
Wenn ich die obige Spezifikation ausführe, wird folgende Fehlermeldung angezeigt:
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 ==)
Wie kann ich die Spezifikation bestehen lassen?
Hinweis : Ich habe auch Folgendes versucht (beachten Sie den utc
Zusatz):
it "updates updated_at attribute" do
Timecop.freeze
patch :update
@article.reload
expect(@article.updated_at.utc).to eq(Time.now)
end
Die Spezifikation wird jedoch immer noch nicht bestanden (beachten Sie die "got" -Wertdifferenz):
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 ==)
===
anstelle von ==
- Derzeit vergleichen Sie die object_id von zwei verschiedenen Zeitobjekten. Obwohl Timecop die Datenbankserverzeit nicht einfriert. . . Wenn Ihre Zeitstempel vom RDBMS generiert werden, funktioniert dies nicht (ich gehe davon aus, dass dies hier kein Problem für Sie ist)
===
, aber das kann unter dem Überschreiten der zweiten Grenzen leiden. Wahrscheinlich ist es am besten, einen eigenen Matcher zu finden oder zu schreiben, in dem Sie in Epochensekunden konvertieren und einen kleinen absoluten Unterschied berücksichtigen.