Manipulando o tempo nos testes da aplicação

Dicas - 11/Abr/2021 - por André Kanamura

Viajar no tempo não é possível (ainda?) na vida real, mas pelo menos dentro dos testes de uma aplicação Rails isso pode ser facilmente realizado com alguns métodos "ajudantes".

Em muitas ocasiões quando precisamos testar certas funcionalidades numa aplicação, acaba sendo necessário simular ações que ocorrem temporalmente no passado ou no futuro... ou até que o tempo seja congelado por alguns instantes. Em aplicações Rails podemos contar com alguns métodos do módulo ActiveSupport::Testing::TimeHelpers.

Por exemplo, se quisermos simular que uma determinada ação está acontecendo no passado, podemos usar o método travel_to e passar uma data específica a ele:

include ActiveSupport::Testing::TimeHelpers

Time.zone.now
=> Wed, 07 Apr 2021 13:48:57 -03 -03:00

travel_to Time.zone.local(1985, 10, 26, 01, 15, 00)
=> nil

Time.zone.now
=> Sat, 26 Oct 1985 01:15:00 -03 -03:00  

Usando o travel_to podemos configurar uma data e hora exatos em que queremos executar uma determinada ação, inclusive, uma data futura. Agora, para podermos restaurar o dia e hora para as atuais, você pode usar o método travel_back. Note que talvez seja necessário incluir o módulo no seu projeto para que os métodos fiquem disponíveis.

Um dos efeitos colaterais do travel_to é que, além de viajar no tempo e definir a data e hora, ele também congela o tempo. Em alguns casos isso pode até ser desejado, mas em outros infelizmente pode ser um problema.

Também existe um método que permite apenas congelar o tempo, isso pode ser feito com o método freeze_time:

Time.zone.now
=> Wed, 07 Apr 2021 13:59:20 -03 -03:00

# alguns segundos depois...

Time.zone.now
=> Wed, 07 Apr 2021 13:59:27 -03 -03:00

freeze_time
=> nil

Time.zone.now
=> Wed, 07 Apr 2021 13:59:36 -03 -03:00

Time.zone.now
=> Wed, 07 Apr 2021 13:59:36 -03 -03:00

Além desses, o método travel permite modificar o tempo para frente ou para trás conforme o parâmetro passado a ele.

Time.current
=> Fri, 07 Apr 2021 14:40:10 -03 -03:00

travel 13.minutes
=> nil

Time.current
=> Fri, 07 Apr 2021 14:53:10 -03 -03:00

Você também pode utilizar os métodos days, seconds, week, para controlar essa viagem no tempo.

Embora sejam limitados, esses métodos do Rails já oferecem algumas funcionalidades bem úteis para as situações em que manipular o tempo é necessário.

Referências e outras leituras

Foto de perfil do autor
André Kanamura

Dev na Campus Code