¿Cómo prueba la inexistencia de un elemento usando broma y reaccionar-prueba-biblioteca?

5 minutos de lectura

Avatar de usuario de SomethingOn
algo en

Tengo una biblioteca de componentes para la que estoy escribiendo pruebas unitarias para usar Jest y react-testing-library. En función de ciertos accesorios o eventos, quiero verificar que ciertos elementos no se representen.

getByText, getByTestIdetc tiro y error en react-testing-library si no se encuentra el elemento que hace que la prueba falle antes de que expect fuegos de función.

¿Cómo prueba algo que no existe en broma usando la biblioteca de pruebas de reacción?

  • Quiero decir que el hecho de que esta pregunta haya tenido tanta popularidad habla de lo intuitiva que es la API.

    – Cristián E.

    10 mayo 2022 a las 14:29

avatar de usuario de kentcdodds
kentcdodds

De DOM Testing-library Docs – Aparición y desaparición

Los elementos de afirmación no están presentes

El estandar getBy los métodos arrojan un error cuando no pueden encontrar un elemento, por lo que si desea hacer una afirmación de que un elemento es no presente en el DOM, puede usar queryBy API en su lugar:

const submitButton = screen.queryByText('submit')
expect(submitButton).toBeNull() // it doesn't exist

El queryAll La versión de las API devuelve una matriz de nodos coincidentes. La longitud de la matriz puede ser útil para las aserciones después de agregar o eliminar elementos del DOM.

const submitButtons = screen.queryAllByText('submit')
expect(submitButtons).toHaveLength(2) // expect 2 elements

not.toBeInTheDocument

El jest-dom biblioteca de utilidades proporciona la
.toBeInTheDocument() matcher, que se puede utilizar para afirmar que un elemento está en el cuerpo del documento o no. Esto puede ser más significativo que afirmar que el resultado de una consulta es null.

import '@testing-library/jest-dom/extend-expect'
// use `queryBy` to avoid throwing an error with `getBy`
const submitButton = screen.queryByText('submit')
expect(submitButton).not.toBeInTheDocument()

  • Mis malos kentcdodds, gracias. solía getByTestId y obtuve el mismo error. Y no revisé las preguntas frecuentes, lo siento. ¡Gran biblioteca! ¿Puedes modificar tu respuesta para incluir `.toBeNull();

    – Algo en

    12 oct 2018 a las 16:58

  • Creo que el enlace de arriba estaba destinado a apuntar a la documentos de la biblioteca de pruebas de reacción

    – pbre

    4 de enero de 2019 a las 16:59

  • El nuevo sitio de documentos se publicó hace unos días. Debería haber usado un enlace más permanente. ¡Gracias por la actualización @pbre!

    – kentcdodds

    4 de enero de 2019 a las 20:18

  • Otro recurso útil: testing-library.com/docs/react-testing-library/cheatsheet

    – Algo en

    08/04/2019 a las 18:50

  • y queryByText para aquellos que quieren el equivalente a getByText eso es nulo seguro

    – S..

    3 de agosto de 2019 a las 9:26

Usar queryBy / queryAllBy.

Como usted dice, getBy* y getAllBy* lanzar un error si no se encuentra nada.

Sin embargo, los métodos equivalentes queryBy* y queryAllBy* en lugar de regresar null o []:

consulta por

queryBy* consultas devuelven el primer nodo coincidente para una consulta y devuelven null si ningún elemento coincide. Esto es útil para afirmar un elemento que no está presente. Esto arroja si se encuentra más de una coincidencia (use queryAllBy en su lugar).

consultaTodoPor
queryAllBy* las consultas devuelven una matriz de todos los nodos coincidentes para una consulta y devuelven una matriz vacía ([]) si ningún elemento coincide.

https://testing-library.com/docs/dom-testing-library/api-queries#queryby

Entonces, para los dos específicos que mencionaste, en su lugar usarías queryByText y queryByTestIdpero estos funcionan para todas las consultas, no solo para esas dos.

  • Esto es mucho mejor que la respuesta aceptada. ¿Es esta API más nueva?

    – RubbelDieKatz

    25 de noviembre de 2019 a las 10:13

  • ¡Gracias por las palabras amables! Esta es básicamente la misma funcionalidad que la respuesta aceptada, por lo que no creo que sea una API más nueva (pero podría estar equivocado). La única diferencia real entre esta respuesta y la aceptada es que la respuesta aceptada dice que solo hay un método que hace esto (queryByTestId) cuando en realidad hay dos conjuntos completos de métodos, de los cuales queryByTestId es un ejemplo específico.

    – sam

    25 de noviembre de 2019 a las 14:23


  • Gracias, prefiero mucho más esto que establecer ID de prueba

    – Hylle

    22 de abril de 2020 a las 22:27

  • Gracias por esa detallada explicación. Es una diferencia tan sutil que no la vi a pesar de mirar su ejemplo aquí: github.com/testing-library/jest-dom#tobeinthedocument :cara-palma:

    – San Juan

    2 de febrero de 2021 a las 16:10

  • Necesitaba saber cómo hacer esto para getByTestId ya que eso es lo que quiero desactivar. No sabía que tenían un queryByTestId que me hubiera llevado al menos otra consulta en DuckDuckGo y quién sabe cuánto tiempo adicional para encontrar una solución adecuada. Mucho Graciaaahhh!

    – A-Doblaje

    31 de agosto de 2022 a las 8:03

getBy* arroja un error cuando no encuentra un elemento, por lo que puede verificarlo

expect(() => getByText('your text')).toThrow('Unable to find an element');

  • Esto puede ser bastante propenso a errores. Los lanzamientos de errores se utilizan con fines de depuración y no para la verificación.

    – Milen Gardev

    6 de enero de 2021 a las 17:03

  • Esto funcionó en mi caso, pero solo después de usar la función de flecha. ¿Puede decirme por qué lo necesitamos? No funciona sin él.

    – Raúl Mahadik

    5 de julio de 2022 a las 6:42

  • @RahulMahadik porque expect(…) llamará a la función anónima cuando esté lista para detectar/atrapar un error lanzado. Si omite la función de flecha anónima, llamará inmediatamente a una función de lanzamiento a medida que se ejecuta el código, que inmediatamente deja de ejecutarse.

    – Ian Mac Farlane

    23 de agosto de 2022 a las 1:00


const submitButton = screen.queryByText('submit')
expect(submitButton).toBeNull() // it doesn't exist

expect(submitButton).not.toBeNull() // it exist

Debe usar queryByTestId en lugar de getByTestId.

Aquí hay un ejemplo de código en el que quiero probar si el componente con la identificación de “automóvil” no existe.

 describe('And there is no car', () => {
  it('Should not display car mark', () => {
    const props = {
      ...defaultProps,
      base: null,
    }
    const { queryByTestId } = render(
      <IntlProvider locale="fr" messages={fr}>
        <CarContainer{...props} />
      </IntlProvider>,
    );
    expect(queryByTestId(/car/)).toBeNull();
  });
});

avatar de usuario de matrixb0ss
matrizb0ss

Funcionó para mí (si quieres usar getByTestId):

expect(() => getByTestId('time-label')).toThrow()

avatar de usuario de n1koloza
n1koloza

Espero que esto sea útil

esta tabla muestra por qué/cuándo hay errores de función

qué funciones son asíncronas

¿Qué es la declaración de retorno para la función?

ingrese la descripción de la imagen aquí

  • Esto puede ayudarme, uso queryByTestId() y verifico con toBeNull()

    – Pranat Pannao

    17 de febrero a las 4:35

¿Ha sido útil esta solución?