Skip to main content

Aparecimento e Desaparecimento

Algumas vezes precisas de testar se um elemento está presente e depois desaparece ou vice-versa.

Aguardar pelo aparecimento

Se precisares de esperar por um elemento aparecer, os utilitários de async/await permite-te esperar por uma afirmação ser satisfeita antes de prosseguir. Os utilitários de espera voltam a entrar até a consulta passar ou pausar. Os métodos assíncronos retornam uma promessa, então deves sempre usar await ou .then(done) quando estiveres a chamá-los.

1. Usando Consultas de findBy

test('movie title appears', async () => {
// o elemento não está inicialmente presente...
// esperar pelo aparecimento e retornar o elemento
const movie = await findByText('the lion king')
})

2. Usando waitFor

test('movie title appears', async () => {
// // o elemento não está inicialmente presente...

// esperar pelo aparecimento dentro de uma afirmação
await waitFor(() => {
expect(getByText('the lion king')).toBeInTheDocument()
})
})

Aguardar pelo desaparecimento

A função auxiliar assíncrona waitForElementToBeRemoved usa uma função de resposta para consultar pelo elemento em cada mutação do DOM e resolver para true quando o elemento for removido:

test('movie title no longer present in DOM', async () => {
// o elemento é removido
await waitForElementToBeRemoved(() => queryByText('the mummy'))
})

Usar a MutationObserver é mais eficiente do que sondar o DOM em intervalos regulares com waitFor.

A função auxiliar assíncrona waitFor volta a tentar até a função envolvida parar de lançar um erro. Isto pode ser usado para afirmar que um elemento desaparece da página:

test('movie title goes away', async () => {
// o elemento está inicialmente presente...
// notar o uso da queryBy ao invés de getBy para retornar nulo
// ao invés de oferecer a própria consulta
await waitFor(() => {
expect(queryByText('i, robot')).not.toBeInTheDocument()
})
})

Afirmar que os elementos não estão presentes

Os métodos getBy padrão lançam um erro quando não poderem encontrar um elemento, então se quiseres fazer uma afirmação de que um elemento não está presente no DOM, podes usar as APIs de queryBy:

const submitButton = screen.queryByText('submit')
expect(submitButton).toBeNull() // este não existe

A versão das APIs de queryAll retorna um arranjo de nós correspondentes. O tamanho do arranjo pode ser útil para afirmações depois dos elementos serem adicionados ou removidos do DOM:

const submitButtons = screen.queryAllByText('submit')
expect(submitButtons).toHaveLength(0) // não espera nenhum elemento

not.toBeInTheDocument

A biblioteca de utilitário jest-dom fornece o correspondente .toBeInTheDocument(), o qual pode ser usado para afirmar que um elemento está no corpo do documento, ou não. Isto pode ser mais importante do que afirmar que resultado de uma consulta é null:

import '@testing-library/jest-dom'
// usar `queryBy` para evitar lançar um erro com `getBy`
const submitButton = screen.queryByText('submit')
expect(submitButton).not.toBeInTheDocument()