Skip to main content

Usando Temporizadores Falsos

Em alguns casos, quando o teu código usa temporizadores (setTimeout, setInterval, clearTimeout, clearInterval), os teus testes podem tornarem-se imprevisíveis, lentos e estranhos.

Para solucionar estes problemas, ou se precisares de depender de marcas de tempo no teu código, a maioria das abstrações de testagem oferecem a opção para substituir os temporizadores verdadeiros nos teus testes com uns falsos. Isto deveria ser usado esporadicamente e não sobre uma base regular já que usá-lo inclui algumas despesas gerais.

Quando estiveres a usar os temporizadores falsos nos teus testes, todo código dentro do teu teste usa os temporizadores falsos.

O padrão comum para configurar os temporizadores falsos é normalmente dentro de beforeEach, por exemplo:

// Temporizadores falsos usando Jest
beforeEach(() => {
jest.useFakeTimers()
})

Quando estiveres a usar os temporizadores falsos, precisaras de lembrar-te de reiniciar os temporizadores depois do teu teste executar.

A razão principal para fazer isto é para prevenir que bibliotecas de terceiros que executam depois de o teu teste terminar (por exemplo, limpeza de funções), de serem associadas aos teus temporizadores falsos e ao invés dos falsos usarem os temporizadores verdadeiros.

Para isto normalmente chamas useRealTimers dentro de afterEach.

É importante também chamar runOnlyPendingTimers antes de alternar para os temporizadores verdadeiros. Isto garantirá que faças descarga de todos os temporizadores pendentes antes de alternares para os temporizadores verdadeiros. Se não prosseguires os temporizadores e apenas alternares para os temporizadores verdadeiros, as tarefas agendadas não serão executadas e receberás um comportamento inesperado. Isto é na sua maioria importante para os terceiros que agendam tarefas sem estares ciente destas.

No bloco de código abaixo está um exemplo fazendo isto usando a Jest:

// Executando todos os temporizadores pendentes e
// alternando para os temporizadores verdadeiros usando a Jest
afterEach(() => {
jest.runOnlyPendingTimers()
jest.useRealTimers()
})