Ir para o conteúdo principal

Usando Temporizadores Falsos

[Tradução Beta Não Oficial]

Esta página foi traduzida por PageTurner AI (beta). Não é oficialmente endossada pelo projeto. Encontrou um erro? Reportar problema →

Em alguns casos, quando seu código usa temporizadores (setTimeout, setInterval, clearTimeout, clearInterval), seus testes podem se tornar imprevisíveis, lentos e instáveis.

Para resolver esses problemas, ou se você precisa depender de timestamps específicos no seu código, a maioria dos frameworks de teste oferece a opção de substituir os temporizadores reais nos seus testes por versões falsas. Isso tem um efeito colateral - ao usar temporizadores falsos nos seus testes, todo o código dentro do teste usará temporizadores falsos.

O padrão comum para configurar temporizadores falsos geralmente fica no beforeEach, por exemplo:

// Fake timers using Jest
beforeEach(() => {
jest.useFakeTimers()
})

Como temporizadores falsos simulam funções nativas de temporização, é necessário restaurar os temporizadores após a execução do teste, assim como mocks convencionais. Isso evita que temporizadores falsos vazem para outros casos de teste e funções de limpeza, onde temporizadores reais são esperados.

Para isso, geralmente chamamos useRealTimers no afterEach.

É importante também chamar runOnlyPendingTimers antes de alternar para temporizadores reais. Isso garantirá que você processe todos os temporizadores pendentes antes de alternar para temporizadores reais. Se você não avançar os temporizadores e apenas alternar para temporizadores reais, as tarefas agendadas não serão executadas e você terá um comportamento inesperado. Isso é especialmente importante para bibliotecas de terceiros que agendam tarefas sem seu conhecimento.

Aqui está um exemplo de como fazer isso usando jest:

// Running all pending timers and switching to real timers using Jest
afterEach(() => {
jest.runOnlyPendingTimers()
jest.useRealTimers()
})
nota

Combinar temporizadores falsos com user-event pode causar timeouts em testes. Consulte a opção advanceTimers para evitar esse problema.