Contenido del curso
Pruebas de Servicios y Dependencias
- 5

Spectator para unit tests en Angular
03:35 min - 6

Pruebas de Pipes en Angular con Spectator y Jest
10:08 min - 7

Genera unit tests en Angular con AI
13:40 min - 8

Cómo testear servicios Angular con Spectator
15:10 min - 9

Creación de Datos Simulados con la Librería Faker.js
10:39 min - 10

Pruebas Unitarias para Servicios con Inyección de Dependencias en Angular
15:58 min - 11

Pruebas Unitarias con Mocking en MetaTax Service
08:28 min - 12

Pruebas de Servicios HTTP Client en Angular con Spectarer y Jest
15:08 min
Pruebas de Componentes
- 13

jest-fetch-mock para pruebas con fetch
09:55 min - 14

Mocking de APIs Globales en JavaScript para Pruebas Unitarias
09:33 min - 15

Pruebas Unitarias de Componentes en Angular con Spectator
11:51 min - 16

data-testid para queries en componentes Angular
Viendo ahora - 17

Cómo espiar Outputs con jest.spyOn en Angular
10:28 min - 18

Unit Testing para Componentes con Inyección de Dependencias
15:13 min
Casos Prácticos y Aplicaciones
- 19

Mocking y pruebas unitarias en Angular: Inyección de dependencias
10:20 min - 20

Pruebas Complejas en Angular: Testing de Componentes y Servicios
15:22 min - 21

Pruebas de Mocking y Deferred Components en Angular
10:26 min - 22

Pruebas de Interacción en Componentes Angular: Galería de Imágenes
08:46 min - 23

Múltiples dependencias mockeadas en Angular
08:03 min
data-testid para queries en componentes Angular
Resumen
Probar la interfaz gráfica de un componente Angular implica algo más que validar lógica: necesitas asegurarte de que los elementos visuales se rendericen correctamente. Aprenderás a hacer queries al render del componente usando selectores de tag, selectores CSS y la función byTestId de Spectator, una técnica clave para escribir pruebas robustas y mantenibles.
¿Cómo verificar que un elemento se renderiza con el contenido correcto?
La forma más directa de probar la interfaz es preguntarle al componente renderizado si existe un elemento específico con cierto contenido. Si tienes un componente que muestra el título de un producto dentro de un H3, puedes hacer query a ese tag y validar que su texto coincida con el título esperado [01:05].
Para mantener consistencia entre pruebas, conviene declarar el producto como una constante reutilizable, por ejemplo mockProduct, y usarla dentro del beforeEach. Así evitas regenerar datos en cada test y aseguras que el componente se renderice siempre con la misma entrada.
typescript spectator.detectChanges(); const element = spectator.query('h3'); expect(element?.textContent).toContain(mockProduct.title);
Después de llamar a detectChanges(), que dispara el ciclo de render de Angular, puedes hacer la verificación. La prueba pasa, pero hay un problema: si mañana cambias el H3 por un H4, tu test se rompe.
¿Qué hace
detectChanges()en una prueba de Angular? Dispara el ciclo de detección de cambios para que el componente se renderice con los inputs actuales. Sin esa llamada, el DOM no refleja los datos inyectados.
¿Por qué usar data-test-id en lugar de selectores HTML?
Acoplar tus pruebas a tags específicos del HTML las hace frágiles. Un cambio de diseño cualquiera puede romper decenas de tests sin que la lógica se haya tocado. La solución estándar en el mundo del testing es marcar los elementos con un atributo dedicado: el data-test-id [03:10].
Este atributo no es un id de HTML tradicional ni una clase de estilos. Es un identificador exclusivo para pruebas, lo que significa que sobrevive a refactors visuales y a cambios de tag.
html
<h3 data-test-id="product-title">{{ product.title }}</h3>Una vez marcado el elemento, puedes hacer query usando un selector CSS de atributo:
typescript const element = spectator.query('[data-test-id="product-title"]'); expect(element?.textContent).toContain(mockProduct.title);
Ahora puedes cambiar el H3 por un H4, un span o un div, y el test seguirá funcionando mientras el data-test-id no cambie.
¿Cómo simplificar el query con la función byTestId de Spectator?
Escribir el selector [data-test-id="..."] cada vez es repetitivo y propenso a errores tipográficos. Spectator ofrece una función dedicada llamada byTestId que abstrae esa cadena por ti.
typescript import { byTestId } from '@ngneat/spectator/jest';
const element = spectator.query(byTestId('product-title')); expect(element?.textContent).toContain(mockProduct.title);
Solo le pasas el ID, y la función arma internamente el selector de atributo correcto. El comportamiento de la prueba es idéntico al de un selector CSS, pero el código queda más limpio y menos propenso a errores con comillas o guiones.
¿Qué es byTestId en Spectator? Es una función helper que recibe un identificador y genera el selector
[data-test-id="..."]por ti, evitando errores de digitación al escribir el atributo manualmente.
¿Cuándo conviene y cuándo no usar data-test-id?
Esta técnica es prácticamente universal: la encontrarás en Jest, Spectator, Testing Library y en frameworks de end-to-end como Cypress, Selenium o Playwright [05:50]. Pero tiene matices importantes que debes considerar antes de aplicarla en cualquier elemento.
El data-test-id funciona bien cuando el elemento es único dentro del contexto de la prueba. Si lo pones en elementos que se repiten, como dentro de un for o un *ngFor, el selector ya no apunta a un único nodo: te devolverá una colección, o solo el primer match, dependiendo del framework.
Algunas reglas prácticas para usarlo bien:
- Aplícalo en elementos únicos como títulos, botones de acción principal o contenedores de detalle.
- Evítalo en elementos iterativos sin un sufijo que los diferencie, por ejemplo
product-item-1,product-item-2. - Combínalo con selectores de contexto cuando haya riesgo de colisión, por ejemplo buscando el
data-test-idsolo dentro delproduct-detail. - Mantén una convención de nombres consistente en todo el proyecto.
¿Por qué evitar data-test-id en elementos repetidos? Porque el selector traerá múltiples coincidencias y no podrás garantizar a cuál estás apuntando. Algunos frameworks devuelven el primero, otros toda la lista, y eso introduce ambigüedad en tus pruebas.
La delicadeza está en el diseño del identificador: piensa en cada data-test-id como un contrato entre tu HTML y tus pruebas. Si lo respetas, tus tests se vuelven más estables y tu refactor de UI deja de ser una pesadilla.
¿Ya estás usando data-test-id en tus componentes Angular? Cuéntame en los comentarios qué convención de nombres aplicas en tu equipo.