J'utilise Ruby on Rails 4 et le gem 2.14 rspec-rails. Pour mon objet, je voudrais comparer l'heure actuelle avec l' updated_at
attribut d'objet après l'exécution d'une action du contrôleur, mais je suis en difficulté car la spécification ne passe pas. Autrement dit, étant donné ce qui suit est le code de spécification:
it "updates updated_at attribute" do
Timecop.freeze
patch :update
@article.reload
expect(@article.updated_at).to eq(Time.now)
end
Lorsque j'exécute les spécifications ci-dessus, j'obtiens l'erreur suivante:
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 ==)
Comment puis-je faire passer les spécifications?
Remarque : j'ai également essayé ce qui suit (notez l' utc
ajout):
it "updates updated_at attribute" do
Timecop.freeze
patch :update
@article.reload
expect(@article.updated_at.utc).to eq(Time.now)
end
mais la spécification ne passe toujours pas (notez la différence de valeur "obtenue"):
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 ==)
===
au lieu de ==
- vous comparez actuellement object_id de deux objets Time différents. Bien que Timecop ne gèle pas l'heure du serveur de base de données. . . donc si vos horodatages sont générés par le SGBDR, cela ne fonctionnera pas (je suppose que ce n'est pas un problème pour vous ici cependant)
===
, mais cela peut souffrir du franchissement des secondes limites. Le mieux est probablement de trouver ou d'écrire votre propre matcher, dans lequel vous convertissez en secondes d'époque et permettez une petite différence absolue.