Kiel vojaĝi per tempo en Rails kontrolilo

Foje mi trovas min en situacio kie mi volas kontroli tempon en kontrolilo. Eble mi volas certigi ke semajno post io, io alia okazos. Rails 4.1 enmetis helpfunkciojn por tio ActiveSupport::Testing::TimeHelpers.

La tri Rails helpfunkcioj 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 prenas tempodaŭron kaj kodblokon kaj ene de la kodbloko la tempo ŝanĝiĝas tiom multe.

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 ordema, 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 version, antaŭ 4.1, aŭ vi ne uzas Rails, vi bezonas uzi gem kiel Timecop kaj mi tute rekomendas tiun gem. Mi uzis ĝin dum jaroj kaj ĝi helpis min kontroli malfacilan kodon.