Skip to content
Connecter les besoins aux solutions

Geler le temps en « Ruby on Rails »

Tags: , ,

Gérer le temps… à plusieurs reprises dans la création d’application la gestion mais surtout le contrôle du temps devient important. Par exemple, un système d’enregistrement avec expiration… ou une offre avec date de début et de fin. Traditionnellement on changerait, à travers le code ou encore directement sur le poste de travail ou le serveur, l’heure et la date de la machine. En Ruby, grace à la capacité de redéfinition d’objets et de classes on peut simplifier et automatiser le processus… jusqu’à geler le temps… De cette façon il devient possible dans les tests unitaires automatisés de vérifier si le code se comporte correctement à une date précise, si les délais d’expirations et autres calculs sont correctes, et ce, sans avoir à changer l’heure sur l’horloge de son ordinateur. J’ai découvert cette méthode simple en étudiant la suite de tests unitaires pour un des engins de Ruby on Rails. Le code de base permet d’avancer et reculer le temps. Le code original provient du Login Engine. Je l’ai amélioré pour fournir un temps constant La classe Time fournit l’heure et la date pour beaucoup de code en Ruby, le principe est qu’en réécrivant la méthode now on peut jouer avec le temps comme on veut. Voici le code:

require ‘time’ Time.class_eval { if !respond_to? :now_old # somehow this is getting defined many times. @@advance_by_days = 0 @@constant_date_time = nil cattr_accessor :advance_by_days cattr_accessor :constant_date_time class Il y a deux aspects intéressant à ce code. L’instruction alias qui permet de renommer une méthode existante. Et la méthode now qui est la réécriture du temps avec constante et délai.