1
resposta

Solução alternativa para o teste utilizando waitFor

Olá.

Pesquisando no Stack Overflow e na documentação da RTL, vi que existe um método chamado waitFor que também resolve esse problema, sem a necessidade de criar um act e chamar explicitamente a função setTransacoes em result.current[1]. O resultado é um código mais próximo do que realmente acontece ao chamar o hook.

Segue como o código fica:

describe('hooks/useListaTransacoes.js', () => {
    test('deve retornar uma lista de transações e uma função que a atualiza', async () => {
        buscaTransacoes.mockImplementation(() => mockTransacao);

        const { result } = renderHook(() => useListaTransacoes());

        // componente acabou de ser montado, retorna lista vazia
        expect(result.current[0]).toEqual([]);

        // espera pelo término do retorno assíncrono do useEffect para testar a assertiva
        await waitFor(() => expect(result.current[0]).toEqual(mockTransacao))
    })
})
1 resposta

Oi Matheus, tudo bem?

Muito obrigada por compartilhar essa solução alternativa para o teste utilizando waitFor! Realmente, essa função é muito útil para esperar por atualizações assíncronas e torna o código mais próximo do que realmente acontece ao chamar o hook.

Com essa solução encontrada o código fica mais limpo e fácil de entender.

É sempre bom ter diversas opções para resolver um problema e essa solução é uma ótima alternativa.

Um abraço e bons estudos.