Testes envolvendo tempo: usando a gem time-warp
É comum que precisemos “manipular o tempo” quando escrevendo testes para código cujo comportamento depende do momento no tempo.
Uma técnica comum é utilizar um mock ou stub na classe Time do Ruby para manipular o horário de acordo com o desejado. Isso vai contra um princípio importante do uso de fake objects em testes: “Não use fakes em objetos que não são seus“. Na maioria do tempo isso pode não causar problemas, mas alterar o comportamento de uma classe usada internamente pela linguagem não soa bem e pode causar bugs difíceis de rastrear.
Aí entra a gem time-warp. Ela ainda trabalha sobre as classes do Ruby, mas provê uma camada específica para testes para todo código executado em um bloco definido pelo programador. Um exemplo de uso (da nossa aplicação feita para o Rails Rumble):
it "should only silence tweets with the desired word inside the configured time interval" do pretend_now_is(Time.now.utc.beginning_of_day + 1.hour) do tweet1.sent_at = 2.minutes.ago tweet2.sent_at = 32.minutes.from_now tweet3.sent_at = 1.hour.from_now collection = [tweet1, tweet2, tweet3] Silencer.apply(collection, {:word => "soccer", :until => 30.minutes.from_now}) end tweet1.should be_filtered tweet2.should be_filtered tweet3.should_not be_filtered end |
A gem adiciona o método “pretend_now_is”, que recebe um parâmetro com o horário desejado e um bloco. Dentro desse bloco, todo código executado é “transportado no tempo” para o horário definido. Além de tornar a manipulação das classes de tempo mais segura, o código fica muito mais elegante.
Veja mais detalhes no README da gem.
Nenhum comentário até agora