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
, getByTestId
etc 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?
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 usarqueryBy
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 esnull
.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 agetByText
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 devuelvennull
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 queryByTestId
pero 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 cualesqueryByTestId
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();
});
});
matrizb0ss
Funcionó para mí (si quieres usar getByTestId):
expect(() => getByTestId('time-label')).toThrow()
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?
-
Esto puede ayudarme, uso queryByTestId() y verifico con toBeNull()
– Pranat Pannao
17 de febrero a las 4:35
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