Manipulando o tempo em blocos de código

Dicas - 17/Mai/2021 - por André Kanamura

Anteriormente vimos um pouco sobre os métodos freeze_time, travel_to e travel_back para manipular o tempo dentro de testes em aplicações Rails. Mas o que não mostramos é que esses métodos podem receber blocos de código que serão rodados dentro das condições especificadas, então vamos falar um pouco sobre isso aqui.

Em alguns cenários de testes é importante podermos simular a execução de diferentes ações que acontecem em datas e horários distintos e para isso podemos usar os métodos citados acima junto com blocos de código:

include ActiveSupport::Testing::TimeHelpers

  travel_to (Time.zone.local(1985, 10, 26, 01, 15, 00)) do
    # executa um conjunto de ações
  end

  travel_to (Time.zone.local(2015, 10, 26, 01, 15, 00)) do
    # executa outro conjunto de ações
  end

O código dentro dos blocos do travel_to ficam delimitados para a data e hora definidos no método, e fora do bloco o tempo permanece normal. Por exemplo, vamos considerar uma aplicação que registra o dia e horário de solicitações de serviços e as apresenta numa lista. Podemos simular a criação de múltiplos objetos em diferentes datas usando blocos:

scenario 'Registra data e horário de solicitações' do
  travel_to (Time.zone.local(1985, 10, 26, 01, 15, 00)) do
    2.times do
      Solicitation.create()
    end
  end

  travel_to (Time.zone.local(2015, 10, 26, 01, 15, 00)) do
    3.times do
      Solicitation.create()
    end
  end

  visit solicitations_path

  # expectativa
end

Assim conseguimos criar 2 solicitações com uma data e em seguida outras 3 solicitações em outra data. Fora do escopo dos blocos o tempo continua sendo o atual, por isso, não é necessário usar travel_back e as demais ações podem ser executadas normalmente.

Referências e outras leituras

Foto de perfil do autor
André Kanamura

Dev na Campus Code