Kiel vojaĝi per tempo en Rails kontrolilo

Kiel vojaĝi per tempo en Rails testoj

Foje mi trovas min en situacio kie mi volas kontroli tempon en testoj (aŭ kontroliloj). Eble mi volas certigi, ke semajnon post io, io alia okazos. Rails 4.1 aldonis helpajn funkciojn por tio: ActiveSupport::Testing::TimeHelpers.

La tri Rails helpaj funkcioj estas: travel (vojaĝi), travel_to (vojaĝi_al) kaj travel_back (vojaĝi_reen). Per ili oni povas ŝanĝi la tempon al la pasinteco aŭ estonteco por kontroli la ĝustan logikon.

Travel ricevas tempodaŭron kaj kodblokon, kaj ene de la kodbloko la tempo ŝanĝiĝas je tiu daŭro.

Time.current # => Thu, 15 Oct 2015 22:10:05 CDT -05:00
travel 1.day do
  Time.current # => Fri, 16 Oct 2015 22:10:05 CDT -05:00
end
Time.current # => Thu, 15 Oct 2015 22:10:05 CDT -05:00

travel_to ankaŭ ricevas kodblokon:

Time.current # => Thu, 15 Oct 2015 22:10:05 CDT -05:00
travel_to 2.days.from_now do
  Time.current # => Sat, 17 Oct 2015 22:10:05 CDT -05:00
end
Time.current # => Thu, 15 Oct 2015 22:10:05 CDT -05:00

Aŭ se oni volas ion pli ordigitan, oni povas uzi travel_to kaj travel_back sen kodblokoj:

Time.current # => Thu, 15 Oct 2015 22:10:05 CDT -05:00
travel_to 2.days.from_now
Time.current # => Sat, 17 Oct 2015 22:10:05 CDT -05:00
travel_back
Time.current # => Thu, 15 Oct 2015 22:10:05 CDT -05:00

Se vi uzas malnovan Rails-versio, antaŭ ol 4.1, aŭ vi ne uzas Rails, vi bezonas uzi gem kiel Timecop, kaj mi plene rekomendas tiun gem. Mi uzis ĝin dum jaroj kaj ĝi helpis min kontroli kompleksan kodon.