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.