Pruebas avanzadas para React con Vitest, React Testing Library y Playwright | Babak Mehrabi | Skillshare

Velocidad de reproducción


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Pruebas avanzadas para React con Vitest, React Testing Library y Playwright

teacher avatar Babak Mehrabi, Teaching difficult things in simple way

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Lecciones en esta clase

    • 1.

      Introducción al curso

      1:49

    • 2.

      Requisitos previos del curso

      1:27

    • 3.

      Por qué son importantes las pruebas

      3:18

    • 4.

      Diferentes tipos de pruebas

      1:35

    • 5.

      Pirámide de prueba

      1:59

    • 6.

      Introducción a las herramientas de prueba para este curso

      1:43

    • 7.

      Repositorios simples de blog y cómo administrarlos (parte 1)

      1:50

    • 8.

      Repositorios simples de blog y cómo administrarlos (parte 2)

      2:11

    • 9.

      Recorrido por el proyecto de blog simple

      2:36

    • 10.

      Introducción a Vitest y sus características

      2:11

    • 11.

      Instalación más rápida

      2:55

    • 12.

      Escribir la prueba de primera unidad

      3:31

    • 13.

      Configurar Vitest y completar nuestra prueba unitaria

      5:08

    • 14.

      Definición y métricas de cobertura de código

      3:30

    • 15.

      Cobertura de código vs. cobertura de prueba

      2:58

    • 16.

      Cómo agregar un informe de cobertura a Vite

      2:54

    • 17.

      Informe de cobertura del código

      8:11

    • 18.

      Cómo agregar pruebas unitarias para QueryKeys

      6:30

    • 19.

      ¿Qué es el estampado?

      3:24

    • 20.

      Cómo escribir una prueba unitaria para FetchPosts con la ayuda de la prueba de impresión

      12:47

    • 21.

      Prueba unitaria de escritura para usoPublicaciones

      12:52

    • 22.

      Prueba unitaria de escritura para fetchPostById

      3:32

    • 23.

      ¿Cómo funciona la mutación CreatePost?

      5:27

    • 24.

      Prueba de escritura para usar CreatePost (parte 1)

      8:28

    • 25.

      Prueba de escritura para usar CreatePost (parte 2)

      6:49

    • 26.

      Pruebas unitarias para su usoEditarPublicar y usarEliminarPublicar

      3:02

    • 27.

      Haz pruebas de fábricas y sus beneficios

      6:53

    • 28.

      Introducción a FakerJs

      2:47

    • 29.

      Cómo usar FakerJS con Post Factory

      6:35

    • 30.

      Resumen del módulo de prueba unitaria

      2:14

    • 31.

      Introducción a las pruebas de integración

      1:37

    • 32.

      Configuración del entorno para las pruebas de integración

      4:16

    • 33.

      Escribir la primera prueba de integración

      3:22

    • 34.

      JSDom vs. entorno del navegador

      2:39

    • 35.

      Terminar las pruebas de integración para PostComponent

      6:35

    • 36.

      Informe de cobertura de código para PostComponent

      0:52

    • 37.

      Prueba de integración de escritura para el componente de pie de página

      3:33

    • 38.

      Prueba de integración por redacción para la página de contacto

      8:52

    • 39.

      Prueba de integración de redacción para la página Acerca de

      1:47

    • 40.

      Prueba de integración de redacción para página de blog (parte 1)

      12:59

    • 41.

      Prueba de integración de redacción para página de blog (parte 2)

      14:01

    • 42.

      Introducción a la prueba de escritura para la sección de administración

      2:24

    • 43.

      Diferentes métodos y acciones de eventos de usuario

      2:05

    • 44.

      Prueba de escritura para la mesa de administración (parte 1)

      10:13

    • 45.

      Prueba de escritura para la mesa de administración (parte 2)

      14:10

    • 46.

      Prueba: editar el elemento de acción

      10:52

    • 47.

      Prueba del botón de eliminar (caso 1)

      3:47

    • 48.

      Prueba del botón de eliminar (caso 2)

      6:29

    • 49.

      Cómo obtener un informe de cobertura para el componente ListPosts del administrador

      2:21

    • 50.

      Introducción a la sección de CreatePost

      1:57

    • 51.

      Observar el componente CrearOrEditPost

      3:21

    • 52.

      Prueba de procesamiento de elementos de forma correcta

      11:55

    • 53.

      Prueba de escritura para postcreación

      10:47

    • 54.

      Prueba de parámetros de createPost

      9:08

    • 55.

      Análisis de la cobertura de código para el componente createOrEditPost

      2:32

    • 56.

      Agregar una prueba para el caso de falla de la API

      8:48

    • 57.

      Agregar prueba para la edición de la publicación

      15:41

    • 58.

      Agregar una prueba de validación para la selección de imágenes

      3:21

    • 59.

      Resumen del módulo de pruebas de integración

      1:29

    • 60.

      Introducción a las pruebas finales finales 2

      2:08

    • 61.

      Instalación de dramaturgo

      4:28

    • 62.

      Ejemplos de pruebas de dramaturgos

      4:11

    • 63.

      Métodos y ayudas del dramaturgo para hacer pruebas

      4:05

    • 64.

      Escribir nuestra primera prueba de E2E

      1:45

    • 65.

      Prueba el encabezado del blog

      1:19

    • 66.

      Prueba de evento de clic y navegación entre páginas

      8:07

    • 67.

      Introducción a la interfaz de usuario de Playwright

      2:57

    • 68.

      Ejecutar a Dramaturgo en el modo de depuración

      2:53

    • 69.

      Añadir puntos de ruptura con la ayuda del método page.pause

      4:20

    • 70.

      La estrategia de localización y los métodos getBy* de Playwright

      3:51

    • 71.

      Métodos más comunes de getBy*

      3:00

  • --
  • Nivel principiante
  • Nivel intermedio
  • Nivel avanzado
  • Todos los niveles

Generado por la comunidad

El nivel se determina según la opinión de la mayoría de los estudiantes que han dejado reseñas en esta clase. La recomendación del profesor o de la profesora se muestra hasta que se recopilen al menos 5 reseñas de estudiantes.

8

Estudiantes

--

Proyectos

Acerca de esta clase

Domina las pruebas en React: desde el más rápido hasta el dramaturgo, ¡construye aplicaciones sólidas con confianza!

¿Estás creando aplicaciones modernas de React y quieres asegurarte de que sean robustas, libres de errores y listas para la producción? ¡Ya no tienes que buscar más! Este curso práctico te lleva paso a paso a través de las estrategias de prueba más avanzadas utilizando las herramientas más poderosas de hoy: Vitest, React Testing Library (RTL) y Playwright.

Tanto si eres desarrollador de front-end, ingeniero de QA o profesional full-stack, este curso te dotará de las habilidades más demandadas que las principales empresas de tecnología buscan activamente.

Qué aprenderás:

  • Por qué las pruebas son importantes, y cómo ahorrar tiempo y dinero

  • Pruebas unitarias, integraciones y E2E con la pirámide de pruebas moderna

  • Cómo configurar y usar Vitest para realizar pruebas unitarias rápidas

  • Simulación de solicitudes de red y React Query con Vitest

  • Escribir pruebas del mundo real para hooks personalizados y lógica API

  • Desarrollo guiado por pruebas (TDD) con la biblioteca de pruebas de React (RTL)

  • Cobertura de código: métricas importantes y cómo mejorarlas

  • Pruebas integrales de aplicaciones de React con Playwright

  • Arquitectura de prueba eficiente para proyectos de React del mundo real

Herramientas y tecnologías utilizadas:

  • Vitest: un test nativo Vite ultrarrápido

  • React Testing Library (RTL): para probar UI desde el punto de vista del usuario

  • Playwright: Para realizar una prueba completa del navegador (pruebas E2E)

  • Prueba: aprende a probar la lógica de red y asíncrona con confianza

  • Herramientas de cobertura de código: obtén información y mejora la calidad de las pruebas

Aprendizaje basado en proyectos

¡Este curso es 100 % práctico! Trabajarás con un repositorio de aplicaciones de blogging del mundo real, escribiendo pruebas que reflejarán lo que harás en un entorno profesional:

  • Probar la búsqueda y mutación de publicaciones

  • Cubre todos los casos del borde

  • Dominar las estrategias para hacer simulaciones

  • Aplicar las mejores prácticas para organizar suites de prueba

Para quién es este curso:

  • Desarrolladores de React que quieren ir más allá de lo básico y escribir código confiable y comprobable

  • Ingenieros que se preparan para entrevistas técnicas o para la transición a cargos superiores

  • Profesionales de QA que buscan añadir pruebas de frontend automatizadas a su conjunto de habilidades

  • Cualquiera que esté desarrollando aplicaciones de producción y quiera confianza en su código

Al final de este curso, podrás:

  • Escribir pruebas unitarias, de integración y E2E como un profesional

  • Comprender las pruebas desde la teoría hasta la implementación en el mundo real

  • Crear suites de pruebas robustas y mantenibles con herramientas modernas

  • Desarrollar la confianza para reformular y escalar aplicaciones de forma segura

¡Inscríbete ahora!

Comienza a dominar las pruebas en React hoy mismo y crea aplicaciones a prueba de balas en las que los usuarios (y tu equipo) puedan confiar. Tu futuro yo (y tu próximo empleador) te lo agradecerán.

¡Haz clic en Inscríbete ahora y lleva tus habilidades de pruebas en React al siguiente nivel!

Conoce a tu profesor(a)

Teacher Profile Image

Babak Mehrabi

Teaching difficult things in simple way

Profesor(a)
Level: Intermediate

Valoración de la clase

¿Se cumplieron las expectativas?
    ¡Superadas!
  • 0%
  • 0%
  • Un poco
  • 0%
  • No realmente
  • 0%

¿Por qué unirse a Skillshare?

Mira las galardonadas Skillshare Originals

Cada clase tiene lecciones cortas y proyectos prácticos

Tu membresía apoya a los profesores de Skillshare

Aprende desde cualquier lugar

Ve clases sobre la marcha con la aplicación de Skillshare. Progresa en línea o descarga las clases para verlas en el avión, el metro o donde sea que aprendas mejor.

Transcripciones

1. Introducción al curso: Hola, y bienvenidos al curso Pruebas avanzadas para reaccionar con prueba V, biblioteca de pruebas de reacción y dramaturgo Este es un curso muy completo. Te enseñaré todo el concepto sobre las pruebas en la reacción. Primero comenzaremos con pruebas unitarias con prueba V. Hablaré de las fábricas de prueba. Implementaremos FACRes con la ayuda de la biblioteca ACG. Y luego vamos a pasar al siguiente paso que es la prueba de integración. Vamos a utilizar la biblioteca de pruebas de reacción. Te voy a enseñar todo sobre biblioteca de pruebas de reacción y vamos a usar eventos de usuario para simular las acciones que los usuarios, por ejemplo, hacer clic, enviar para ingresar información, y luego iremos y probaremos toda nuestra aplicación con el framework tend testing, que es dramaturgo Ya creé dos repositorios para este proyecto. Te voy a mostrar como puedes configurar un simple bloque con react y todas nuestras pruebas y todas las conferencias se harán para este blog y aquí puedes ver que tenemos un panel de administración y te voy a caminar sobre la configuración del proyecto en cada paso, harás la codificación conmigo. Puedes sentarte a ver los videos y también implementarlos tú mismo. Y al final del curso, tendremos una aplicación completa probada con todos los tipos diferentes de pruebas como pruebas unitarias, integración y pruebas finales. Estoy muy emocionada de verte en el curso y por favor únete a mí en el curso, nos divertiremos mucho en este curso juntos. 2. Requisitos previos del curso: Y ¿cuáles serán los requisitos previos del curso? He diseñado este curso para no requerir muchas cosas. Un conocimiento básico de mecanografía y Javascript y también un conocimiento básico de reaccionar sería suficiente para este curso Y todo lo que necesitas aprender sobre las pruebas, voy a cubrir en el curso para que no necesites saber nada sobre las pruebas. Puedes aprender todo en este curso, solo un conocimiento básico sobre cómo funciona JavaScript y cómo funcionan los mecanografiados y qué es reaccionar, cómo funcionan los componentes reaccionan sería suficiente para este Hay una sección buena para conocer. He utilizado TNSaquery o Rea Query para la comunicación entre el cliente rea y nuestro servidor No J. Pero si no lo sabes, no es obligatorio tenerlo. Voy dentro de los videos, te diré cómo funciona y cómo puedes usarlo. Pero si ya lo trabajaste, te sería más fácil seguir el curso. Pero si no has trabajado, yo ya ya te voy a enseñar todo lo que necesites para este curso. Como dije anteriormente, no necesita, no necesitas saber mucho antes de comenzar este curso. Simplemente inicia este curso conmigo y te enseñaré todo en la duración del curso. Empecemos juntos. 3. Por qué son importantes las pruebas: Hablemos de por qué son importantes las pruebas. Las pruebas nos ayudarán a asegurarnos de que el código funciona como se esperaba. Además, las pruebas nos ayudarán a prevenir la regresión. ¿Y qué significa esto regresión? Cualquier cambio en el software puede romper la funcionalidad existente. Y si hacemos algún tipo de codificación y esta codificación cambia alguna parte del código, pero rompe otra parte del código, llamaremos a este tipo de errores como regresión. Las pruebas nos ayudarán a prevenir regresiones, y las pruebas también nos ayudarán a garantizar un mejor diseño de código Cuando el código ha sido cuando estamos agregando más pruebas, nos ayuda a que nos ayude al desarrollador y a nosotros a comprender mejor el código y nos ayuda a tener un mejor diseño de código. Y además aumenta la confiabilidad del producto. Aumenta la calidad del producto, y traerá confianza para todo el equipo porque el equipo conoce la calidad del producto, y esto le da confianza al equipo. Y ahorra mucho tiempo a largo plazo porque cuando se quiere agregar nuevas características, hay muchas pruebas que asegurarán que las funcionalidades antiguas no se rompan. Y además, si algo sucede, puedes detectarlo inmediatamente en el primer paso. Por lo que también te ayudará a ahorrar tiempo a largo plazo. ¿Y cuál es la diferencia entre las pruebas manuales y las pruebas automatizadas? Por lo que en las pruebas manuales, se requiere de un equipo. Las pruebas manuales suelen ser realizadas por humanos. Entonces un probador de software suele ser más alto y luego él o ella comienza a probar cada flujo posible que en el software pueda suceder, y este es el proceso de las pruebas manuales. Pero las pruebas manuales requieren equipo y requiere mucho tiempo cada vez que el equipo de desarrollo software cambia algo en el software, el equipo A necesita hacer muchas pruebas, y esto requiere mucho tiempo. Como no es propenso a errores ya que todos los humanos podemos cometer errores. Entonces tal vez en la primera vez, hay un error y alguien lo encuentra, pero tal vez la próxima vez que alguien olvidó que debería verificar un flujo y luego pierde este flujo y luego no se detecta el error Por lo que todo el proceso no es propenso a errores. Y también puede ser un trabajo aburrido. Por lo general, cuando un equipo trabaja más de seis meses o un año y todos los días están probando los mismos flujos. A veces se está volviendo aburrido para ellos, y también cuando se vuelve aburrido, significa que no ponen atención de 100 personas en este trabajo, y hace que no se puedan encontrar algunos de los bichos, y estamos volviendo al artículo que no es error pro. Y hablemos del 4. Diferentes tipos de pruebas: En pruebas automatizadas, tenemos tres tipos diferentes de pruebas. La primera es la prueba unitaria, segunda es la prueba de integración y la tercera es la prueba de E a E o de N a N. ¿Qué son las pruebas unitarias? En las pruebas unitarias, nos estamos enfocando solo en una unidad. Por ejemplo, una función o una clase, y nuestro propósito es probar esta unidad separada de todas las demás funcionalidades y todos los demás componentes de nuestro en pruebas de integración, vamos a un nivel superior, y luego estamos probando la integridad de los diferentes componentes y módulos. Primero, con las pruebas unitarias, estamos seguros de que cada unidad está funcionando como se esperaba. En las pruebas de integración, nuestro enfoque es ver cómo funcionan juntas estas unidades. Entonces, por ejemplo, si la API agrega un nuevo campo y el front-end no está al tanto de este nuevo campo, entonces podemos tener una prueba de integración para asegurarnos de la integridad entre nuestro front-end y nuestro BC. Y el último es terminar las pruebas gemelas. Al final de las pruebas gemelas, veremos el sufrir como un todo. Vamos a probar el conjunto sufren desde la perspectiva independientemente de cuántos componentes, cuántos módulos y cómo estos componentes y estos módulos interactúan entre sí. Lo estamos probando en su conjunto y como sistema. 5. Pirámide de prueba: Hablemos del prompt de prueba. Como mencioné anteriormente, tenemos tres tipos diferentes de pruebas. La primera es la prueba unitaria, las pruebas de integración y las dos pruebas finales. Y si vemos estos tres tipos de pruebas como una pirámide, en la parte superior, tenemos pruebas unitarias, que es que tenemos muchas pruebas. Son rápidos cuando queremos ejecutarlos y son baratos, por lo que no requieren mucho tiempo y podemos escribir fácilmente pruebas unitarias. Son fáciles de mantener, y son fáciles de cambiar. Y como resultado, tenemos muchas de las pruebas unitarias. En la parte inferior de la pirámide, hemos terminado diez pruebas, que significa que suelen estar en ambiente de producción, hay pocas pruebas TN, y ejecutar este tipo de pruebas, es lento, y también es caro. Por lo que requiere mucho tiempo para escribir este tipo de pruebas y también el mantenimiento de estas pruebas son realmente difíciles y consumen mucho tiempo. Y como resultado, no tenemos tantas pruebas TN finales en relación con las pruebas unitarias. Sin decir que no debes tenerlo en tu proyecto y tu producción, cuanto más tengas las pruebas TN, es mejor para que puedas brindar más calidad para tu software. Pero en relación con las pruebas unitarias, que es fácil de escribir y son mucho más rápidas para su ejecución, tenemos en la práctica en entorno de producción, en ambiente puesta en escena, generalmente mucho menos pruebas NTN en relación con las pruebas unitarias. Y entre ellos, hay pruebas de integración. Por lo que hay más de dos t, menos que unidades. Y del costo, también están en el medio, por lo que no son tan baratos como la prueba unitaria, pero tampoco son tan caros como las dos pruebas finales. 6. 06 introducción a herramientas de prueba para este curso: Muy bien, ensuciémonos las manos. En este módulo, voy a hablar de las herramientas de prueba que vamos a utilizar para este proyecto y también te voy a mostrar cómo configurarlas y cómo instalarlas y cómo ejecutarlas. Empecemos. Las herramientas de prueba que estamos utilizando para reaccionar para este proyecto es V test react testing library y dramaturgo Y estamos usando la prueba V para pruebas unitarias, y para las pruebas de integración, estamos usando la biblioteca de pruebas de reacción o RTL, y para las pruebas TN, estamos usando dramaturgo En este curso, te voy a mostrar paso a paso, y primero comenzaremos escribiendo prueba unitaria con VTS y luego vamos a escribir pruebas de integración con RTL, y luego al final, vamos a escribir prueba TN con Así que comencemos. Ya creé dos repositorios para el proyecto. Estos son los enlaces al repositorio front-end y al repositorio del servidor. Y luego el siguiente video, te voy a mostrar sobre la configuración del proyecto. Entonces queremos agregar test para un proyecto que ya se está ejecutando. Te mostraré las características de este proyecto, y luego te platicaré qué componentes queremos probar y cómo será nuestro proceso de pruebas, y también te mostraré cómo puedes ejecutar estos proyectos localmente en tu máquina, para que también puedas seguirme paso a paso durante este curso. 7. 07 repositorios simples de blog y cómo administrarlos parte 1: Así que he creado dos repositorios para este proyecto. Uno se llama Simple blog, que es una aplicación de reactor, y el otro se llama simple Blog server, que es un servicio de empaque para este bloque. Para poder ejecutar este proyecto en tu local, no necesitas JS, y primero tienes que clonar estos repositorios Entonces aquí, cuando presionas este botón, obtendrás una URL, y podrás copiarla y luego dentro de tu terminal, puedes escribir Git clone y luego puedes escribir esto. Ya lo hice, y aquí tengo dos carpetas. Uno de ellos es blog sencillo, uno de ellos es simple empaque de bloques, déjame abrir una nueva pestaña. Y cuando hayas hecho eso, puedes ir fácilmente a allí y para ejecutar los proyectos, necesitas NodeJS Estoy usando NodeJS versión 22. Por lo que también te sugiero que uses exactamente la misma versión para que te asegures de que todo lo que estoy haciendo, también lo puedas hacer en tu máquina local. Entonces si ejecutas versión nodo, tengo la versión 22.14 También sugiero que para usar exactamente la misma versión. Y aquí voy a ir a lo primero que hay que hacer es ejecutar NPM install para instalar la dependencia del proyecto Voy a pausar el video y continuaré después de eso. 8. 08 repositorios simples de blog y cómo administrarlos parte 2: Entonces hice la instalación de NPM, y luego de eso, puedes ejecutar fácilmente NPM Stop. Sólo una nota que deberías notar, voy a cambiar este proyecto y voy a agregar códigos a medida que vayamos en este proyecto juntos. Voy a agregar alguna prueba. Para verificar el inicio del proyecto, he creado una etiqueta, que se llama start tanto para el front end como para el back end. Y cuando quieras revisar el repositorio, puedes ejecutar etiquetas Git, y aquí verás eso lo siento, etiqueta Gits Y aquí verás que tengo una etiqueta, y luego puedes revisar esta etiqueta específica para que puedas volver al inicio del proyecto y puedas continuar tu trabajo conmigo paso a paso. Y cuando yo haga los cambios, tú también puedes hacer los cambios. Después de agregar todas las pruebas, dejaré el repositorio en el patrimonio final, para que también puedas usarlo en el futuro. Bien. Empecemos. Ya tenemos las dependencias y también vamos a ir al back-end Y aquí voy a ir al blog sencillo. Yo y aquí como también necesito ejecutar en PAM instalar. Ya lo hice, así que mis paquetes están al día. Y aquí tienes un archivo que se llama server dot JS. Lo único que necesito para ejecutar es nodo servidor punto JS. Y verás que el servidor se está ejecutando y host local 3,001 ahora que nuestro servicio backend se está ejecutando, vamos al front-end y dejemos ejecutar NPM start y ahora verás que el cliente se está ejecutando en Voy a copiar este enlace y lo voy a abrir en mi navegador, maravilloso. Ahora verás el proyecto. 9. recorrido por el blog simple: Entonces hablemos de lo que es este proyecto. He creado un blog sencillo que cuando vengas a tu página de inicio, verás un blog sencillo. Cada bloque tiene una foto, tiene una imagen, un título, avatar del creador del post. Y luego al hacer clic en eso, podrás ver los detalles del post, y luego cuando vuelvas, verás que puedes volver a la página principal. Como pueden ver, ya tenemos una caja, así que ya tengo mi icono aquí y pero cuando está en la página de inicio, este es un icono predeterminado. Entonces esta es una de las cosas que las pruebas nos pueden ayudar. Esta es una intención que la arreglaremos en este curso juntos y además proporcionaremos la prueba para. Tenemos la página Acerca de, que es decir que este es un registro que he creado para este curso y además, estos son los detalles para mí si quieres contactarme. Y este es el sitio del blog, y también tenemos un túnel admin el cual puedo escribir slash admin Y aquí, voy a ver el número de los posts que se han publicado. Y para ser precisos, debes escribir slash admin slash Y también podemos ver el post aquí. Podemos crear un nuevo post, podemos editar posts y podemos eliminar posts. Entonces por ejemplo, si voy y si edito este post, y luego acabo de tener un dos al final del post, puedo ver que esto ha sido cambiado. Si voy al blog sencillo, puedo ver también esto ha sido cambiado. Si vuelvo a la sección admin home, voy al post y voy a devolver esto a lo que era antes. Y no tenemos autenticación. Aquí no es importante en este momento para nosotros. Por lo general, en el entorno de producción, se debe ocultar el administrador y el usuario debe iniciar sesión. Debe tener una contraseña de usuario, y esta área debe estar protegida Pero para este curso, no se requiere para nosotros. Tenemos este proyecto y ahora queremos agregar pruebas para ello. Estamos comenzando con prueba unitaria y luego vamos a pruebas de integración y luego al final vamos a escribir alguna prueba con plat 10. introducción rápida y sus características: En este curso, vamos a utilizar la prueba V para pruebas unitarias. Pero, ¿qué es VTS? V test es un marco de pruebas unitarias rápido y por defecto, soporta mecanografiado El proyecto react que he creado con TypeScript y la mayoría de los proyectos modernos también son con Esta es una muy buena característica de la prueba que podemos usar V test con TypeScript Y además es solo API compatible. Si previamente has trabajado con react, muchos desarrolladores de react anteriormente usaban Jest para pruebas unitarias, y VTS y T son hoy en día más moderna y una herramienta más rápida que estamos Y VTS también es API compatible. VTS tiene la API compatible con J. Así que es realmente útil para los desarrolladores que ya tienen experiencia con el JS aprendiendo VTS es mucho más fácil porque tenemos la misma API como describirla, esperar, y todas estas API son las El cuidado de aprendizaje para VTS para los desarrolladores que previamente han trabajado con Jess es mucho fácil y tanto, no requiere tanto tiempo Una de las características de VTS es que admite cobertura de código lista para usar. Voy a discutir sobre la cobertura de cotización en las futuras conferencias. Pero por ahora, solo debes saber que test por defecto nos proporciona el reporte de cobertura de Code y también proporciona la ejecución de prueba paralela. Nuestra prueba no necesita ejecutar una prueba secuencial en una por una, ejecutarlas en paralelo, lo que las hace más rápidas y podemos ejecutar nuestra prueba más rápido. Vamos a configurar nuestro entorno de prueba. En el siguiente video, te voy a mostrar cómo agregar la prueba a nuestro proyecto y vamos a escribir nuestra primera prueba unitaria. 11. Instalación rápida: He abierto el proyecto dentro de mi identificación. Estoy usando webstorm. Puedes usar cualquier identificación que te sienta más cómodo con él. Webstorm es un producto comercial. Puedes obtener una prueba de 30 días si quieres usarla y si te gusta, puedes comprarla. Estoy disfrutando mucho trabajando con él, así que ya lo compro, pero no tienes que comprarlo. Puedes usar Atom sublime o cualquier otro editor de texto o ID que te sienta más cómodo con él. Y así veamos la estructura del proyecto. Tenemos una carpeta SRC aquí. Tenemos una carpeta admin que está relacionada con la sección admin del registro web, que es post adicion post removal agregando post. Tenemos una carpeta llamada API para la comunicación API. Tenemos una carpeta constante para la constante y el sitio es la parte de bloque que cada usuario puede ver el post el compartido es algunos componentes que se comparten entre el sitio web y admin. Abramos la carpeta constante y aquí tenemos un archivo de índice y aquí se han definido tres variables. Vamos a configurar la prueba y escribamos primero nuestra primera prueba para este archivo. Para instalar test, voy a mi terminal y voy a escribir en pristall dash DSD significa que esto es solo para dependencias dev, y esta dependencia no forma parte de nuestras dependencias de producción Es sólo para el desarrollo. Cuando ejecute este comando, verán ese paquete paquete que Jason ha sido cambiado y si veo qué archivo se ha cambiado, ahora dentro de nuestras dependencias dev, tenemos V test Cuál es la diferencia entre la dependencia de profundidad y la dependencia normal las dependencias de profundidad solo se usarán para el desarrollo local porque las pruebas escribimos pruebas para ejecutarlas solo cuando estamos desarrollando y no son parte del entorno de producción, por lo que instalamos VTS como dependencia de profundidad Ahora tenemos VTSt y déjanos ir y aquí quiero crear una primera prueba Por defecto, por convención, lo nombraré como prueba, yo diría indexar la prueba, los ts vamos a escribir nuestra primera prueba. 12. 12 escribir la primera prueba unitaria: Para escribir nuestra primera prueba, primero definimos un bloque describir y un bloque describir dirá lo que vamos a probar. Porque voy a probar un archivo constante, voy a llamar a esta constante y por dentro, segundo parámetro será una función que estoy pasando. Y aquí lo escribiré y aquí puedo definir qué condición quiero que me prueben. El primer parámetro es una cadena que, por ejemplo, vamos a escribir la prueba y vamos a asegurarnos de que el nombre del curso es stay always y cuyo valor correcto es este valor. Déjame entonces escribir mi primero, luego diría que debería devolver el valor correcto para el nombre de host. El segundo parámetro también es una función que puedo pasar y voy a definir mi prueba aquí. Aquí, tenemos lo que vamos a esperar de la prueba y lo que vamos a esperar. Tenemos una función expect de prueba B que podemos dar una condición y luego comprobará si esta condición es verdadera o falsa o ¿cuál debería ser? Aquí, voy a usar el nombre del curso y voy a importar el nombre del curso. Estoy esperando que el nombre del curso sea esta prueba avanzada con react y Test. Creo que aquí también, tengo un problema porque este curso no se trata de est, pero debería escribirlo con dramaturgo, pero lo arreglaremos juntos ahora Con esto, esta será nuestra primera prueba. ¿ Qué significa eso? Eso significa que primero voy a definir un bloqueo describir y describir es una colección de la prueba y cada prueba estará dentro de él bloque, el primer parámetro será un mensaje que si la prueba está fallando, debería nos dirá este mensaje para que podamos identificar cuál de las pruebas está fallando. Y aquí voy a escribir exactamente lo que voy a esperar. Como pueden ver en mi vastorm ID ya detectado y tengo dos fondos aquí, y esto es algo genial de gastrom que también brinda soporte para TS Pero si estás usando otro ID o algo más, puedes justo dentro de tu terminal escribir la prueba NPX V. Como puedes ver, se detecta automáticamente y está ejecutando mi prueba, pero tengo un error y dice que describir no está definido. La razón es que aún no hemos configurado V test. En el siguiente video, voy a configurar la prueba V. 13. 13 Configuración de Vitest y finalización de nuestra primera prueba unitaria: Así que vamos a configurar nuestra prueba. Dentro de este proyecto, hay un archivo que se llama punto JS. Esta es una configuración para la T. Con el fin de agregar la configuración para prueba, también agregaré un parámetro aquí. Aquí, verás que estamos diciendo que nuestro proyecto es un proyecto. Y también para nuestras importaciones, todo lo que está ordenado, por favor reemplácelo por SRC Aquí voy a agregar una sección y para la prueba, y voy a poner los globales a true y ambiente a la J Describe, estas son las palabras clave globales, y aquí le estoy diciendo a VTS que para entender describir y Como puede ver, el error es que describir no está definido. Con esta configuración, estamos diciendo que queremos tener los globales. Para nuestras pruebas, que es describirlo y también nuestro entorno de pruebas será Jz Vayamos a la terminal. Como puede ver, automáticamente vuelve a ejecutar mi prueba. No tuve que empezar y detenerlo de nuevo. Esta es también otra característica interesante de VTS, que se vuelve a ejecutar automáticamente la prueba cuando se le cambia Ahora, verán que mi prueba está fallando y dice que nuestro valor esperado es prueba avanzada con prueba reacciona y el valor recibido es otra cosa. Vamos a ver cuál era en realidad el valor. El valor real está aquí. Ahora, no agregué la sección de dramaturgo, así que solo dije que estoy esperando que este valor sea esta p, lo cual definitivamente está mal Voy a sustituir este valor. Ahora cuando digo vamos a ver que automáticamente lo vuelve a ejecutar y esta vez estoy esperando que pase mi prueba. Como pueden ver ahora, mi prueba está pasando. También puedo dejarme presionar Control C y también correr y recoger prueba. Ahora tengo una prueba fallida y una prueba pasada. Esta es la prueba predeterminada por react. Déjame ir también y quitar esto en el Ts cinco. He creado este proyecto con create react up y esta prueba ha sido creada por react déjame también eliminar eso y dejarnos ir. Ahora nuestra prueba debe estar limpia. Tenemos una prueba y esta prueba está pasando. Increíble. Y ¿sabes cuál es el beneficio de tener esta prueba? Dónde vemos esta cadena dentro de nuestro blog web. Ya ves aquí tengo un simple bloque creado para el curso avanzado testing reaccionamos. Si solo hacemos pruebas manuales, este texto está en el pie de página y cuando los bloques se complican más y mucha gente que trabaja con diferentes elementos y el tester, puede ignorar fácilmente esta parte. En consecuencia, un desarrollador puede venir y comenzar a escribir y tal vez quiera escribir algo, pero no se da cuenta de que en realidad está escribiendo, así que hará esto y cuando haga esto, verá que nuestro registro web está roto. Pero con esta prueba, de inmediato, veremos que una de las pruebas está fallando. Así puedo ver exactamente en qué archivo y qué línea de prueba es falsa. Déjame primero eliminar solo porque esta prueba para la línea del curso será atlas testing para react with test, RTL y Plavt Cambié la prueba, pero no cambié el valor real, así que vamos y también cambiemos el valor real. A partir de estos momentos que tengo esta prueba, lo sé, estoy seguro de que esta parte del texto siempre será correcta. Nadie por error si viene alguien por error y por ejemplo, en la G, inmediatamente, tenemos una prueba que es fallar. Maravilloso. Continuemos nuestro trabajo sumando más pruebas. 14. Definición y métricas de cobertura de código: Como antes mencioné, uno de los beneficios de VTS es que proporciona el reporte de cobertura de código por defecto ¿Y qué significa cobertura de código? La cobertura de código es una medida para la calidad de nuestra prueba. Dije que vamos a mejorar la calidad de nuestro software con pruebas automatizadas. Y ahora, ¿cómo podemos asegurarnos cuál es la calidad de la prueba? En realidad, cuál es la calidad de nuestra prueba automatizada. Y aquí hay un nuevo concepto que se llama cobertura de código. Y la cobertura del código es el porcentaje es un número basado en el porcentaje, y es el porcentaje de las líneas y el código que se ejecutará cuando estés ejecutando las pruebas. Entonces si tengo una función, si tengo una clase y esta clase tiene diez líneas de código, y si escribo una prueba para esta clase y durante la ejecución de esta prueba, ejecutarán ocho líneas de estas diez líneas, entonces mi cobertura de código será del 80%. Y esta es la definición de la cobertura del código. Y pero la cobertura de código también tienen diferentes métricas. En los próximos videos, te mostraré en su y de hecho podemos ver estos números. Aquí quiero que te des la definición de esta matriz. Tenemos cinco números de su cuando le agregamos reporte de cobertura de código, primero son las líneas. El segundo es una declaración. El tercero es rama, funciones y líneas descubiertas Las líneas en realidad nos muestran cuánto porcentaje de las líneas se ha cubierto. Entonces como dije antes, si tengo una función y esta función tiene diez líneas de código y durante la ejecución, se ejecutarán ocho líneas, entonces la cobertura de código para la métrica de las líneas será del 80%. La declaración es similar a las líneas. La única diferencia es que puedo escribir declaración múltiple en las líneas simples. En el cálculo de líneas, esto se calculará como uno si tengo tres estados. Pero en el número de estado, esto se calculará como un estado. Y rama significa que cada vez que tengo una condición IL o un caso de interruptor que basado en diferente condición, mi programa va en dirección diferente. Esto se llama rama y en realidad su también proporcionar muchos porcentaje de nuestra sucursal ha sido cubierto durante la ejecución de la prueba. Y la función, también el número de las funciones que se han llamado durante la ejecución de la prueba relativo al número entero de las funciones que tenemos en nuestro sesgo de código. Y al final del reporte, también VTS nos proporciona líneas descubiertas, por lo que en realidad podemos ver qué líneas de los códigos han sido cubiertas por la ejecución de nuestras pruebas y qué líneas no han sido Y al ver estas líneas, podemos mejorar y también podemos agregar más pruebas para aquellas líneas que no han sido cubiertas para aumentar una buena cobertura e incrementar la calidad de nuestras pruebas. 15. Cobertura de código vs. cobertura de prueba: También hay otro concepto que se llama cobertura de prueba, y por lo general se discutirá cuando estemos hablando de la cobertura del código, la cobertura código y la cobertura de prueba. Estos son dos conceptos importantes. A veces se han usado indistintamente, pero si queremos ser precisos, cobertura de código es en realidad el porcentaje de la base de código que se ejecuta cuando estamos ejecutando nuestra prueba Y la cobertura de la prueba es un término más general y un término más amplio que se refiere realmente a cuánto ha sido cubierto por la prueba nuestro comportamiento de aplicación . Entonces tal vez haya algunos casos que nuestra aplicación ni siquiera implementamos en nuestra aplicación, y debido a que ni siquiera la implementamos en nuestra base de código, aunque no haya prueba para ellos, no afecta la cobertura del código porque esta parte de la lógica de la aplicación ni siquiera se ha visto. Esto puede ser esto puede suceder que, por ejemplo, un gerente de producto no haya visto alguna funcionalidad que existiera y ni siquiera implementamos esa parte del código. Esta cobertura es un término más general que también trata de abordar y esas condiciones y esos escenarios. Aquí escribí un ejemplo sencillo. He definido una función de división como una función de flecha en una sola línea. Dije que el primer parámetro es número y el segundo parámetro es número y por favor devuelve A dividido por B. Y si agrego una prueba, y si digo, por ejemplo, estoy esperando que cuando estoy dividiendo un cuatro por dos, los resultados serán dos. Entonces mi cobertura de código será del 100% porque solo tengo una línea y esta línea se ejecutará durante la prueba. Por lo que la cobertura del código será del 100%. Pero aquí, no verifiqué si B no es cero. Entonces si llamo a esta función con A y para el valor de la B, pasaré cero, entonces obtendré una excepción, y esto primero, debería verificar que B no sea cero. Y esta es una definición. Este es el concepto de la cobertura de prueba. Y en realidad, no he visto el comportamiento de que B no debería ser cero, y mi código en realidad ni siquiera considera esta opción, y esta condición no ha sido verificada. Pero mi cobertura de código es del 100%. Así que tener una buena cobertura de código es algo realmente bueno. Es algo que deberías intentar tenerlo, pero no quiere decir que nuestra aplicación no tenga ningún problema, ningún error o error alguno. 16. Añadir informe de cobertura a Vitest: Ahora que hemos aprendido el concepto de cobertura de código, agreguemos nuestro informe de cobertura de código y veamos el informe de cobertura de código para nuestra prueba. Para ejecutar la cobertura del código, voy a ejecutar test, diría NP test run coverage. Como pueden ver, dice a esto le falta dependencia no puede encontrar cobertura VD, V, ¿quieres instalarla? Yo diría que sí. Y esperemos hasta que se instale esta dependencia y ahora la tenemos. Vayamos y volvamos a correr la portada. Aquí verán que no voy a conseguir una mesa. Y estos números son los números que he explicado en la evaluación de diapositivas, ramas, función, líneas, y líneas descubiertas Ahora para nuestro índice que es archivo, en realidad vemos el reporte de cobertura de código. Esto está dentro de la constante SRC. Si voy y si encuentro esta carpeta, verán esa constante SRC, tengo el 100% porque esta declaración y estas ramas han sido cubiertas Verás que esto en realidad es verde, y los demás son rojos. Después de eso, después de ejecutar este comando, también tengo una carpeta de cobertura. También puedo abrir esta carpeta de cobertura y también puedo ver el reporte de cobertura de código ejecutando este índice ese archivo GML Déjame dar click sobre esto. Déjame hacer clic derecho sobre este archivo, y luego lo ejecutaría y u. ha abierto columna y déjame simplemente copiar este enlace a mi valiente navega. Vamos a verlo en nuestro breve. Verán que aquí no tengo ninguno de estos archivos han sido probados, así que no veo ningún valor aquí y aquí voy a ver mi índice en Ts cinco. Debido a que se trata de una importación, el momento en que este archivo ha sido importado, las líneas de todas estas variables han sido inicializadas y todas ellas han sido ejecutadas La cobertura es del 100%. Uh, 17. 17 Cómo profundizar en el informe de cobertura del código: Cavemos un poco sobre el concepto de cobertura de código y permítanme cambiar este archivo y agregar una función como lo definí en las diapositivas que estoy esperando y función cual A y B serán número y devuelve y devuelve un valor, que es número y esto es A dividido por B. Ahora agregué la función y no cambio mi prueba, y dejemos correr y ver la cobertura nuevamente. Debido a que estoy usando webstore, webstore tiene una buena integración con test que en realidad está aquí, si escribo clic en el archivo de prueba, puedo ejecutarlo Puedo devugar y además tengo esta opción ejecutar índice con cobertura Y voy a presionar esto. Sin embargo, si no usas webstom, siempre puedes ejecutar el reporte de cobertura con la terminal Pero para una explicación más fácil en este curso, solo estoy dirigiendo esto. Cuando haga esto, en realidad, me va a preguntar, ¿quieres que reemplace el traje o quieres que no aplique ningún cambio o lo reemplace? Voy a presionar reemplazar y luego voy a refrescar la página página que tengo aquí verás que en realidad ahora los estados cuando tenemos el 100%, las ramas, el 100%, la función donde tenemos una función que no ha sido cubierta. Esto es voy a conseguir un cero, si vas a aquí y también puedes ver aquí, que ahora tenemos una función que no ha sido cubierta. Vamos y vamos a implementar también la condición if déjame expandir esto y yo diría, quiero devolver un bebé divoide, pero si ser igual cero, entonces quiero, por ejemplo, verdadera excepción Nuevo error que la división por cero no es posible. El de, iré y volveré. Tengo un error tipográfico aquí, así que déjame escribir división Tengo un tejido de enlace, expreso. También tengo un tejido de enlace aquí. Ahora, agregué una nueva condición aquí y estoy comprobando si B es cero, entonces voy a pasar por una excepción. Vamos y volvamos a ejecutar nuestra prueba. Voy a sustituir. A veces hay un problema con cobertura que en la primera vez no funciona, así que voy a leerlo dos veces para asegurarme de que voy a obtener el número correcto. Ahora verás ese cambio, ha cambiado el reporte de cobertura y déjanos verlo en nuestro HT. Ahora, veremos que en realidad la declaración, tenemos nueve declaraciones, sólo cuatro de ellas han sido probadas. Sucursales es 100% función cero y líneas es sólo cuatro nueves han sido. Todo bien. Vamos y agreguemos una prueba. No necesito esta prueba, no necesito esta función, pero solo la estoy usando como ejemplo. En el siguiente video, voy a agregar algunas pruebas para esta función. Déjame agregar una prueba. Puedo agregar una prueba escribiendo y está aquí, pero como esta es una función diferente, y es una de las mejores prácticas para separar realmente las cosas que están conectadas entre sí. Voy a definir otro bloque describir y lo llamaría dividir y aquí voy a pasar una función, una función de flecha, y luego diría, debería devolver el valor de división de A por B. Entonces en mi prueba, voy a agregar, voy a esperar que si llamo a esta función dividir con cuatro y dos, entonces debería ser dos. Esta será mi prueba. Por intención, no probé las partes cero, así que veamos qué va a pasar. Voy otra vez, voy a hacer la prueba con cobertura y voy a reemplazar y verán que este número ha sido cambiado a 77%. Déjalo ver también aquí. Entonces en realidad, ahora verás que antes era rojo, lo cual no era bueno. Ahora es de color amarillo, así que no somos un verde sil. No estamos en una buena declaración sobre un buen estado, pero es un poco mejor. Por lo que siete de nueve declaraciones han sido cubiertas ramas. Ahora ahora tenemos una función. Si recuerdas en el video anterior, la función era cero porque no llamamos a la función en absoluto, pero las ramas eran 100% porque no se ha llamado a la función, las ramas no se ha calculado porque excepto la función, no tenemos ramas. Simplemente definimos tres variables. Pero ahora que se ejecuta la función y tenemos la cobertura del 100% para la función, solo se está ejecutando uno de nuestros Is y por eso, la cobertura para las sucursales es del 50%. Nuestras líneas y declaración son las mismas. El reporte de cobertura para estos dos son los mismos. Vamos y agreguemos también otra prueba y dejemos una prueba que estamos esperando cuando esta vez voy a pasar cero y estoy esperando que esta vez reciba un error como excepción. Para probar eso podemos usar un proveedor de prueba que se llama a lanzar. Puedo pasar con esto, en realidad puedo decir que cuando quiero esta función debería arrojar un error. También lo envolveré en una función de flecha porque ahora que esta función arroja un error, si no la envuelvo, entonces se interrumpirá la ejecución de todo el archivo. Lo estoy envolviendo en una función de flecha, pero estoy diciendo que estoy esperando que en es la función de flecha. Ser ejecutado, me emociona que un error para ser verdad y ese error el mensaje relativo a ese error debería ser esta fortaleza. Permítanme pegar este valor y ahora volvamos a ejecutar la prueba. Y vamos a reemplazar el traje y increíble. Ahora vamos a obtener una cobertura del 100%. Pasemos al reporte de cobertura. Vamos a refrescar la página. Ahora tenemos un verde. Fantástico. Se han cubierto todas las nueve líneas, ha cubierto toda la declaración. Teníamos un if y s, ambas ramas han sido cubiertas. Teníamos una función que se ha cubierto y todas las líneas han sido cubiertas. Increíble. Hicimos un muy buen trabajo. Continuemos con nuestro trabajo. 18. Cómo agregar pruebas unitarias para QueryKeys: Continuemos nuestro trabajo agregando más prueba. Ya escribí una prueba para la carpeta constante y veremos que la cobertura del código es del 100%, que es realmente. En este video, voy a agregar pruebas para la API. Dentro de la API, tengo una carpeta para los modelos y una carpeta para el post. Y los modelos es la definición real de datos del post. Entonces, si echamos un vistazo a esto, tenemos un tipo de publicación y este tipo de publicación tiene una descripción del título de identificación y tiene una imagen, autor y la fecha de publicación. Y este es un tipo sencillo. Entonces no necesito escribir pruebas para la interfaz porque esto es solo una definición de tipo. Y si voy al post, tengo algo de tanstaquery los ganchos, y tengo la linea de consulta y query Entonces, si no estás familiarizado con Tanstaquery o re aquari, no es problema. Ya tengo otro curso que puedes echar un vistazo si te interesa introducción a Tanstaquery o aquari Pero para este curso, no es obligatorio entender y conocer todas las características de la consulta Tansta Y sólo para darte una pequeña visión general sobre lo que realmente está haciendo. Entonces si voy aquí, estoy leyendo las entradas de este blog de la API. Para ello, te puedo mostrar, por ejemplo, si vamos al sitio, tenemos una página y aquí si vamos a la página del blog, aquí estamos usando un gancho que esta es la sintaxis de la rea cor, y definí use pose que se ha definido aquí. Y esta función en realidad usa rea query para llamar a una función, que se llama query function, que es fetch post ¿Y qué trae esto carteles? En realidad usa Axios para obtener una solicitud de red a la API para la API que tiene la lista de la publicación, y hará una solicitud get y luego al final, devuelve los datos Y debido a que esta es una acción asíncrona y tengo aquí un peso y aquí una sincronización con consulta rea, podemos usar un gancho externo con este cuatro que estoy diciendo, necesito una clave de consulta, que será una cadena, que aquí hay posts, y luego una función de consulta, que es esta función Voy a definir esto como un gancho personalizado y aquí dentro de mi componente, fácilmente puedo llamar a este capó personalizado y esto manejará la operación Async de la llamada a la API obteniendo los datos Puedo mapear estos datos a una variable que se llama pausa y también me devuelve un lingote, que está cargando y también error Se está cargando muestra si este gancho ha sido resuelto, esta llamada a la API ha sido resuelta y si hay un error en la API, entonces se establecerá el error. Y aquí dentro del componente, estoy comprobando si esto está cargando, estoy devolviendo solo un componente de carga, sencillo en un párrafo sencillo. Si esto es un error, voy a devolver error. Y estos dos y si esto se está cargando, es falso y el error también es falso, significa que tengo la lista de los posts. Entonces aquí, voy a mapear. El post y yo los muestro dentro de esta página. Para este curso, lo único que necesitamos saber es que en realidad una consulta usa un cliente de consulta y tenemos este tipo de ganchos y yo uso posts, creé este libro personalizado para devolver todos los posts. Este devuelve una publicación con el ID. Y ésta es para la adición, eliminación de la pose y creación del post. No obstante, si estás interesado en aprender más sobre rea query, puedes ver mi otro curso introducción a Tana Sta query o Ra query. Pero para este curso, no necesitamos saber mucho sobre rea query. Lo único que necesitamos saber es en realidad cómo funciona esta función. Y para este video, voy a agregar prueba de escritura para esta consulta. Y aquí verán que este es un archivo realmente sencillo. Yo solo defino la clave de consulta como un objeto. Tiene una pose clave y el valor es post. Vamos y vamos a crear un archivo de prueba para esto y llamémoslo claves de consulta, la prueba, los ts y voy a escribir un bloque describir. Y voy a tener uno como escrito, correcto, clave de consulta, y no necesito asincrónico, solo necesito Voy a agregar esperar y esperar que esa consulta que los mensajes sean puestos. Y déjame hacer esta prueba. Esta es una prueba fácil también déjame ejecutarla con cobertura y la cobertura debe ser del 100%, lo cual podemos ver. Si volvemos a nuestro valiente navegador, si vuelvo a archivos antiguos, ahora lo verás dentro de la API SLC Para este archivo, no agregué ninguna prueba, pero para este archivo, tenemos cobertura de código del 100%. 19. ¿Qué es el estampado?: Pero la parte más desafiante sería en realidad escribir prueba para estos ganchos personalizados. Veamos el primer gancho. Entonces tenemos uso post. Y por simplicidad, primero, esta es una función fetch post, y luego tenemos use post, y luego estamos usando esta función como una función de consulta y estamos exportando este cons por defecto Esta función es privada, y no hay exportación. Por simplicidad, voy a exportar esta función por ahora y primero vamos a escribir una prueba para esta función. Lo que hace esta función se llama el eje que obtiene y luego pasa la URL para el post y devuelve los datos. Pero recuerda que en las pruebas unitarias, en realidad no nos interesa la interacción con nuestro back end y nuestro APR y si quiero escribir una prueba para esta función y no quiero ejecutar una instancia del back end para mis pruebas. Y esta prueba debería ser porque estoy probando solo esta unidad. Y dentro de las pruebas unitarias, tenemos la suposición de que todas las demás unidades están funcionando como se esperaba, nos estamos enfocando solo en esta unidad. Entonces, cómo podemos hacer eso, y aquí viene un concepto realmente importante en las pruebas unitarias, que es burlarse Entonces, ¿cuál es el concepto de la burla? Mking significa reemplazar una unidad por una unidad falsa. Y esta unidad falsa en realidad se burla del comportamiento de la unidad original Y esta es la razón por la que lo estamos llamando burla. Cuando hablamos de burlarse, significa que no nos interesa el comportamiento real de una unidad o un componente, y solo queremos tener una unidad falsa en lugar de la unidad original Y recuerda que en las pruebas unitarias, nos estamos enfocando en una unidad. Por lo que no nos interesa cómo funcionan las otras unidades. Y por eso, porque queremos agregar una prueba para una unidad y usaremos burlas para las otras unidades y las haremos como falsas con el fin de simplemente actuar como esperamos en lugar de ejecutar el código real detrás de ellas y solo nos enfocamos en la unidad que en realidad estamos escribiendo prueba para ello ¿Cómo podemos hacer marcado en su? Es tanto simple que solo podemos escribir punto Mk entonces pasaremos el nombre del módulo que queremos marcar. En este ejemplo, he usado eje. V es también la forma corta para VTS y la marca es en realidad la función, así que puedo marcar fácilmente un módulo de eje con punto Mg. Vamos a verlo en la práctica. 20. Cómo escribir una prueba unitaria para FetchPosts con la ayuda de la prueba de impresión: Entonces para escribir test, voy aquí, estoy creando un archivo. Yo lo llamaré usar puntos post test. Voy a añadir un bloque describir, y lo llamaré use post y la función dentro de él. Dentro porque tengo dos funciones, voy a crear un bloque describir para cada función. El primero será fetch post. Yo sólo por la parte para la E, dejémosla vacía por ahora. Lo explicaré más adelante lo que queremos escribir aquí. Pero lo que realmente esperamos para que suceda esta función. Cuando estamos llamando a esta función, estamos esperando lo que puede salir mal si un desarrollador cambia esta URL, y esperamos que esta función llame a la URL correcta y luego devuelva los datos correctos. Hagámoslo. Voy y agreguemos esperar bloqueo y queremos importar fetch Bs en lugar de esto, quiero esperar que fetch sea a un estricto igual Cuando digo igual, por lo general se utilizará para tipos primitivos como números enteros. Pero cuando tengo un objeto y porque en Java script, los objetos serán comparados por las referencias, me interesan realmente las propiedades de los objetos. Yo sólo quiero tener estricta igual. Déjame ejecutarlo para ver qué va a tener. Entonces como pueden ver, esto muestra una flecha, promesa esperada porque esta función es una función ASN y solo la estoy llamando Primero arreglemos esto. Llamémoslo la respuesta y esperemos el resultado y digamos que estamos esperando que esa respuesta sea algo respuesta. Porque estoy usando un peso, así que aquí también debería agregar un teclado ASN aquí y dejémoslo ignorar Debido a que esto es una matriz, en realidad debería pasar una matriz de objeto. Caigamos ahora, pasemos una matriz vacía. Hagamos la prueba. Ahora, verás que en realidad se llama el IPI real, pero esto no es lo que estoy esperando Si detengo el servidor, vamos y detengamos el servidor. Detengamos el servidor y háganos saber ejecutar la prueba. Y ahora verás que en realidad no podemos correr. Esto no es en realidad lo que estamos buscando. No queremos tener un servidor funcionando. No queremos tener una interacción con la API. Al final las pruebas gemelas, sí, pero en el concepto en el ámbito de las pruebas unitarias, solo queremos tener que trabajar con una sola unidad. Y para eso, voy a usar marcaje y diría punto Mk xS. Con esta línea, estoy diciendo que en realidad, yo no necesito eje en sí. Sólo necesito una versión marcada del eje. Ahora que escribí esta línea, verán que esta parte es roja. A ver lo que estás diciendo. Dice que no se puede encontrar el nombre en el archivo globals Ts config. Déjame hacerlo y ahora puedo hacerlo. Veamos qué se ha cambiado dentro de nuestro archivo de configuración Ts. Añadió los tipos para el vTest. También TypeScript entiende que estamos usando VTS porque estas son las palabras clave de Sepa que agregué esto, en realidad el exxus ha sido reemplazado por la versión marcada Después de eso, puedo pasar y puedo decir que siempre que estés llamando al exxus con la G, quiero obtener una respuesta en lugar de tener una respuesta real Simplemente definamos una respuesta. ¿Qué queremos? Por ejemplo, queremos que una pose marcada sea una matriz del tipo post. Por ejemplo, ID no sería esta variable sería una matriz de tipo post el post tip tiene tantos parámetros. Veamos qué dice. Pidamos a nuestro ID para colocar donde debería proporcionarnos algunos automáticamente rellenar datos más acción. No y estoy pasando un objeto vacío usando las propiedades IT title description. Desafortunadamente, no aparece en él, así que déjame solo escribir ID sería uno, título sería una cadena de título y la descripción sería una cadena de descripción, qué más me falta creado autor de la imagen publicada. Created t será una cadena vacía, Auor será un objeto Por encima de usted será una cadena vacía y el nombre será una cadena. Déjame usar mi nombre. Ahora nos falta imagen y fechas publicadas y la imagen también nos deja ir con un objeto vacío y la fecha publicada también cadena vacía. Ahora arreglemos todo el archivo con la preta m. y el archivo actual. Ahora quiero usar esto como respuesta para la llamada API. Eso lo puedo hacer diciendo que está marcado. Estoy diciendo que cada vez que ese eje que consigue ha sido llamado, estoy esperando obtener un valor de resultado, que es un objeto y los datos se marcarán post. Permítanme importar también la fuente del eje. Entonces aquí agregamos punto Mg que estamos diciendo en realidad no necesitamos axio y aquí estamos diciendo que cada vez que se ha llamado a AxiusG, esto es exactamente lo que hace esta función es llamar a Necesitamos obtener estos datos. Y ahora cuando se ha llamado a fetch post, ¿qué causa fetch post Si reemplazamos esta línea con ese valor, devuelve la propiedad data, devuelve este objeto. Estoy esperando y mi condición debería ser que esta respuesta sea este post marcado que he definido. Ejecutemos la prueba y debería fallar ahora porque ahora agregué este objeto, así que permítanme reemplazarlo y marcar post y después de eso, esta prueba debería pasar. Maravilloso. Lo que está pasando, permítanme resumirlo de nuevo. Estoy definiendo una matriz de algunos objetos y estoy diciendo cada vez que se ha llamado a Axios, por favor resuelva porque esta es una función ASN, estoy usando valor de resultado marcado También tenemos un valor de retorno de marca, que es para operación síncrona para ASN, estoy usando valor de resultado de marca Por favor, devuelva un objeto que tenga una clave que son los datos y la respuesta debe ser. Siempre que llamemos al puesto de búsqueda, estamos esperando que eso consiga esto Aquí, si inicio el servidor, ahora verás que aún está pasando la prueba porque no tiene ninguna interacción con nuestro nodo servidor JS. Es solo un eje de reemplazo completo con la versión marcada. También hay otra cosa que quiero probar aquí, que en realidad es cuando llamamos a esta función, queremos asegurarnos de que realmente XS get ha sido llamado y ha sido llamado con este parámetro correcto. Para ello, también voy a añadir otra línea para la espera. Yo diría que estoy esperando que axus punto llamado y T nos proporciona la función, que se llama se han llamado WT aquí estoy esperando que debería haber llamado con esta UR Me voy y voy a pasar este valor. Volvamos a ejecutar la prueba y la prueba está pasando. Si un desarrollador por errores viene y cambia esto a, por ejemplo, APURA me deja importar también este No, tenemos una prueba que en realidad prueba que fetch post debe llamarse con la URL correcta Ahora bien, esta prueba está fallando porque dice que se esperaba que te llamaran con una publicación de slash, pero este valor no es correcto Ahora estamos seguros de que pondrá a prueba cualquier cambio en esa función. Ahora escribamos la descripción del I lo que estoy probando, diría que devuelve los datos correctos de API. Veamos también el reporte de cobertura del código de cobertura, vamos a ejecutarlo con cobertura. Veamos nuestro vamos a subir un nivel. Tenemos el pliegue de API ahí y déjame ir a las publicaciones de la API de SRC No agregamos ninguna prueba para estos archivos, pero he usado posts y esta función ha sido probada. Estas líneas rojas significan que este *** ha sido probado, que no es la función que queríamos probar. Pero ahora es increíble. Toda esta función ha sido probada. 21. Prueba unitaria de escritura para usoPublicaciones: Entonces continuemos nuestro trabajo escribiendo pruebas unitarias para esta función, que es usar posts. ¿Y qué esperamos? Esperamos que realmente use query proviene de react query, por lo que es una biblioteca externa. No necesito escribir unidades para biblioteca externa. Lo que estoy haciendo es en realidad debo asegurarme de que estoy pasando la clave de consulta y la función de consulta correctas. Y cuando se resuelva este gancho, estoy esperando obtener los datos que estoy esperando de eso. Y para hacer eso, primero, tenemos que dejarme ir al bloque de describir y dejarme agregar otro bloque de describir. Aquí vamos a agregar otro bloque descrito y este será para uso post, y voy a pasar una función, y aquí voy a agregarlo nuevo. Para el mensaje, yo diría que es bueno devuelve los datos correctos de la APA. Déjanos porque este es un gancho personalizado y necesito renderizar este gancho y necesito envolver este gancho dentro del proveedor. Cómo podemos hacerlo. Voy a definir a usar una consulta rea, como puedes ver aquí, tenemos una línea de consulta primero, primero debemos inicializar una línea quérica Vayamos aquí. Esta también es una parte interesante que quiero mostrar también algo de la definición. Al igual que, tenemos otro bloque al que se llama antes de cada uno y esto antes de que cada uno se ejecute antes que se ejecute cada prueba. Si tenemos alguna inicialización de variables y cosas así, también podemos ponerla aquí y pero para esta prueba, no la necesito, voy a definir mi variable exactamente por encima de esta prueba Déjame poner esto dentro del otro bloque describir porque aquí no necesito esto. Pero déjeme poner esto aquí. Permítanme también crear una función de envoltura que en realidad es una flejadora y espera una intro gira como un elemento JSX, proveedor de clientes acuáticos Aquatic clin proporcionó espera una intro gira como un elemento JSX, proveedor de clientes acuáticos Aquatic clin proporcionó . Y nuestros clientes lo estarán. También cerremos esto. Ahora porque estoy usando TSIX, también debería cambiar el nombre del archivo a TSX Vamos a importar esta consulta proveedor cliente entonces también necesitas importar esto de la a que nuestro cliente será el cliente quer y todo lo demás va a ir dentro de esto solo estoy ping todo lo que estoy pasando a esto voy a pasar propiedades infantiles aquí y voy a decir que hilern es un tipo de tuerca de reacción y la tonelada será elementos de reacción entonces tengo un tipo aquí. Esta será la envoltura. Ahora estoy esperando que devuelva los puestos de la APA. Empecemos a escribir esto. Lo que esperamos si vamos a renderizar este gancho, nosotros si obtienes los resultados aquí, estoy esperando este resultado. Voy a usar react render Hook que lo explicará en un segundo y voy a ir a usar post, y luego también pasaré aquí al rapero. Voy a importar post uso y también voy a importar de testing library react. biblioteca de pruebas es la biblioteca de pruebas de reacción, y vamos a discutirla en el siguiente módulo que es la prueba de integración. Para este video, solo lo estoy importando. Por ahora, lo único que necesitas saber es en realidad, tengo una reserva personalizada reaccionar y de esta manera, puedo renderizar este libro dentro de este envoltorio. Déjame también arreglar esto bonito. Cuando esto suceda, se establecerá el resultado. Pero este gancho es gancho asíncrono y ¿cómo puedo asegurarme de que esto se haya resuelto Porque esta también es una función ASN. Tenemos una función que es esperar de nuevo en la biblioteca react testing que bloqueará nuestra ejecución hasta que se cumpla una condición. ¿Cuál es la condición? ¿Cuál es la condición que estamos esperando de que el resultado que actual es el éxito sea cierto? ¿Qué significa esta línea? Estamos diciendo que debido a que se trata de un AC y es entonces cuando el éxito actual es cierto, por favor espere hasta ese momento. ¿Qué significa eso? Eso significa que react renderiza este gancho y luego rea query llama a la API, que no queremos la API, estamos reemplazando con la versión mark. Pero cuando se haya resuelto el éxito de esa promesa, podemos agregar una condición extra aquí y después de eso, nos aseguraremos de que fetch post se haya completado, podremos obtener los datos de eso con los datos actuales, y vamos a esperar estos datos sean iguales por las publicaciones marcadas Y debería hacer exactamente lo que hice con el marcado de los postes que hice aquí allá. Porque esta variable es la misma, así que voy a subir esto a este nivel para poder usarla en ambos y voy a usar también esta línea. Exactamente como el ejemplo anterior, estoy haciendo estoy marcando el eje que obtiene y aquí estoy esperando que después de eso los resultados sean este valor. Vamos a ejecutar la prueba increíble. Ahora la prueba se está ejecutando, para asegurarnos de que la estamos haciendo correctamente, solo puedo cambiarla a algo así como una matriz vacía y ahora esta prueba debería fallar, claro, porque estamos esperando obtener esta matriz de objeto. Y también la otra condición que me gusta comprobar aquí es que buscar publicaciones para haber sido llamadas en realidad con el mensaje adecuado Y Pero por ahora, podemos simplemente ignorar eso. Lo hago en el siguiente video. Ahora agregamos la prueba. Para este video, es a lo mejor es demasiado. Si lo deseas, por favor regresa si te fue difícil seguir, por favor vuelve a lavar este video Ahora vamos a ejecutar la cobertura y ver toda la cobertura. Ahora tenemos dos describen blog, uno para fetch boost, uno para el boost y ambos están funcionando y ahora verás que todas las líneas rojas se han ido Tan increíble. Tenemos una cobertura del 100% para esto. Al escribir esta prueba aprendimos muchos conceptos. En primer lugar, nos enteramos de las burlas. En segundo lugar, aprendimos sobre cómo podemos renderizar realmente un gancho personalizado dentro del envoltorio. Entonces también aprendimos otra función que es esperar, que es para la operación asíncrona, podemos bloquear nuestra ejecución de la prueba hasta asegurarnos de que la respuesta de reacquery esté Y sabemos que ha sido exitoso y es cierto, y entonces podemos comprobar nuestra condición de que en realidad si marcamos exusgs si estás diciendo que cada vez que exxous ese get ha sido llamado, entonces cuando se haya resuelto este gancho, entonces el valor debe ser Hagamos un poco de limpieza. Como recuerdas, agregué esta exportación a esta función solo por el propósito explicativo porque era más fácil probar esta función. Si yo quería desde el principio probar el anzuelo, entonces deberías saber todo sobre el marcado, todo, pero fue más fácil explicarlo primero. Sólo por esto, que es más fácil y luego para este gancho. Pero verás esa función, la mayoría de las pruebas que escribimos es similar. En realidad, no necesitamos exportar esta función y esta función debe mantenerse privada dentro de esta. Lo único que necesitamos usar es en realidad probar el gancho real. Yo me quito eso. Voy a dejar que también elimine fetch post aquí. Y hagamos la prueba para asegurarnos que en realidad no rompimos nada y ahora tengo un candado descrito en el poste en el nivel superior, así que no necesito este candado descrito. Puedo quitarlo y también puedo hacer un fread aquí para todo el archivo Ahora es más fácil de entender marcado tenemos un objeto marcado, tenemos una alianza querc y tenemos un wrapper y luego lo marcamos y luego esperamos que también pueda traer esto dentro de la prueba, se bloquea esto está relacionado con el a esta prueba En esta prueba, marcamos el eje que obtenemos y luego cuando renderizamos el gancho, esperamos que los resultados sean este valor. 22. Prueba unitaria de escritura para fetchPostById: Enhorabuena. Agregamos una prueba realmente complicada, y estoy feliz de que estés conmigo aquí. Entonces ahora que tenemos esta prueba, agregar una prueba para otros archivos será mucho más fácil. Déjanos hacerlo. Veamos también el post de uso. Esto también es similar. Tenemos el eje que obtiene la diferencia es que aquí estamos obteniendo un post por ID, y luego aquí también devolvemos esta función como una función de consulta para este Hoch, y también la tenemos como una como clave de consulta, tenemos dos parámetros post D. Vamos y creamos un archivo de prueba Voy a también puedo simplemente copiar y pegar este archivo, usar post, y puedo llamarlo, este, este. Usa post esa prueba 65 y lo haré dentro de mi descri, iré con poste y estas partes serán similares Yo diría que devuelve el post por identificación de la APA. Esta vez estoy esperando si tengo este tiempo espero que como esa puerta me devuelva un solo objeto, no una matriz de la pose de marca. También podemos cambiar esto en lugar de una matriz para que sea solo un objeto y voy devolver este remoto estas líneas y vamos a arreglar el pret aquí para este archivo Aquí vamos a esperar que vamos a devolver un objeto y luego vamos a en lugar de usar posts, vas a renderizar usar código postal y luego estamos esperando que los datos se marquen post y también puedes reemplazar esto porque esto no es una matriz así que vamos a usar también un solo formulario para esta variable. Y no necesitamos usar post, hagamos estas pruebas, maravilloso. Corramos también con la cobertura. Veamos también el reporte de cobertura. Y aquí, increíble, también tenemos cobertura de código al 100%. Esto es algo muy importante que quiero decirles que esto está pasando con las pruebas. A lo mejor al principio, requerirá mucho tiempo. Pero cuando tienes un poco de prueba cuando ya tu estructura de proyecto es buena y tienes otras pruebas, puedes agregar fácilmente más pruebas. Lo siento, acabo de olvidar aquí que también puedo debería como un número como parámetro a esto. Esto es realmente fácil. Ahora, agregué otra prueba y también me dejé ir y ejecutar la cobertura para todos los archivos. Puedo ejecutarlo con cobertura de peldaño. Ahora que ya tenemos ambas pruebas veremos que tenemos 100% de cobertura de prueba para la mayoría de estos archivos. 23. ¿Cómo funciona la mutación CreatePost?: En este video, quiero escribir prueba para crear post. Este es un libro personalizado de consulta real que nos permite crear post dentro de nuestro weblog Pero primero, veamos en nuestro tablero y veamos qué está pasando. Así que aquí dentro del panel de administración, tengo C post, que es meno el cual puedo ver todos los posts que se han publicado en el weblog Y puedo crear un nuevo post aquí escribiendo, por ejemplo. Título, descripción de la prueba y también puedo subir la foto. Voy a usar un docure si envío el post ahora verás que enseguida tengo cuatro posts y si voy a mi dashboard, como el número de los posts, voy a ver cuatro aquí Si elimino esta sección de administración y si voy al registro web, también tenemos un nuevo post aquí. Entonces, ¿cómo implementé esto? Implementé esto con una mutación en una consulta. Veamos el código fuente. Uno de los beneficios realmente buenos de rea query es que todas estas acciones se pueden hacer sin tener una tienda. Este es un componente a diferente. Esta es una mesa. Tengo una nueva forma dentro de esta página, que es un componente rea diferente y cómo estos componentes interactúan entre sí. Porque ahora como viste, cuando creé un elemento aquí, esta tabla se ha actualizado inmediato y también este número se ha actualizado de inmediato, y esto está sucediendo, por ejemplo, con borrado, si borro esta publicación, ahora, si voy al teléfono, verás que este número se ha actualizado de inmediato. Rea query proporciona función en consultas de validación, que dentro de eso cuando estoy usando mutación, se está utilizando mutación cuando queremos cambiar datos en el servidor, por ejemplo, adición, creación, eliminación, y todos estos tres son mutación. Y cuando queramos leer los datos, usaremos query y cuando queramos cambiar los datos en nuestra API, usaremos mutación. Y aquí verás el código. El código es sencillo. Solo estoy llamando a una publicación en el punto final de post y estoy pasando un formulario de datos que es toda la descripción del título en la imagen con el encabezado y el éxito, también olvidé lo que se llama aquí común. En caso de éxito, cuando esta API ha sido resuelta y esta API ha sido arreglada, estoy pidiendo rea query para invalidar la consulta, y cuáles son las consultas que quiero invalidar las consultas que está relacionada con los posts Y con esto, le estoy diciendo a rea query que necesitas refetch y recordar todos los hooks que está relacionado, que tienen estas claves de consulta, que es, por ejemplo, usar posts porque esto es también dirás que la clave de consulta es la misma Entonces, cuando hacemos eso y cuando sabemos que agregamos un nuevo post, debe actualizar la lista para el post. Entonces Ra query hace esto por nosotros. Lo único que tengo que hacer es decir invalidar consulta, y después de eso rea Query entiende que esta lista ha sido actualizada También podemos ver juntos. Si vengo aquí, si voy aquí, si voy a la sección de Netfox, creo atPost cuando presiono aquí, cuando agrego una nueva entrada, verás dentro de mi NetforXTPF tengo una solicitud de post, que es para la creación de este No blog, y la carga útil son los parámetros, y la carga útil son los parámetros, si voy a la sección de Netfox, creo atPost cuando presiono aquí, cuando agrego una nueva entrada, verás dentro de mi NetforXTPF tengo una solicitud de post, que es para la creación de este No blog, y la carga útil son los parámetros, lo que he ingresado. Lo interesante que tengo recibe solicitud para el puesto, y esto está sucediendo por invalidar consultas Entonces rea query entiendo que ahora esta consulta esta clave de consulta ha sido invalidada, por lo que recordará la API y esta vez la API devuelve cuatro objetos Por lo que esta tabla también se actualizará. Y esto está ocurriendo. También podemos ver, por ejemplo, para la eliminación, veremos dos solicitudes. Uno primero para la eliminación y esto es ahora, nuevamente, la solicitud de la G y ahora tenemos tres objetos. Y esto está pasando por esta línea. Entonces, para escribir esta mutación, necesito agregar dos pruebas primero para asegurarme que estoy llamando al punto final de API correcto, y la segunda es en realidad cuando estamos sucediendo cuando terminemos el éxito está sucediendo, quiero asegurarme de que estoy invalidando las consultas y también estoy invalidando la clave de consulta correcta. 24. Prueba de escritura para usar CreatePost (parte 1): Así que comencemos a escribir prueba para nosotros crear post. Puedo hacer las pruebas como hicimos para nosotros post marcando los axios, pero en este video, quiero mostrarte otra forma de las pruebas que podemos hacer Para ello, quiero mover esta publicación de subida a otro archivo. Déjame crear un archivo y llamarlo api. Déjame mover esta const a eso, déjame importar exportar publicaciones de carga predeterminadas ¿Por qué estoy haciendo esto? Porque quiero mostrarte otra forma de hacer las pruebas. Ahora que hice esto, ahora estamos importando posts de subida desde estas APIs. También necesitamos la coma aquí. Ahora quiero escribir unidades para esto y quiero tratar esta publicación de subida como una dependencia externa que esté fuera de este módulo. Hay dos formas en las que podemos hacer marcado en prueba versus con marca de punto que te mostré en los videos anteriores y otra forma es con el método de espionaje. Y para este video, quiero usar este nuevo método. Vamos y voy a copiar este uso post test y lo llamaré use create pose y también cambiaré mi descripción para usar Crear Pos. Aquí quiero agregar una nueva prueba que eso en realidad, quiero asegurarme de que cuando mi mutación, cuando uso create pose, llame a la API con el parámetro correcto. Entonces lo llamaré llamadas subir pose cuando se llama mutar En lugar de marcar axios, voy a quitar esta línea y vamos a ver usar crear post Quiero marcar completamente esta función porque ahora es una dependencia externa a esta unidad y en las pruebas unitarias como discutimos anteriormente, no me interesa lo que hacen otras unidades. Quiero reemplazar completamente esta publicación de subida con la versión marcada. Para hacer eso, iré y llamaré voy a quitar esta línea y en lugar de esta línea, llamaré a Spire Como primer parámetro lo llamaré, también puedo ir a cambiar. Vamos a importar estrellas AV de arriba un slash post slash aps Ts de arriba un slash post slash aps Ts El primer parámetro será el módulo que quiero marcar. El segundo será en realidad las exportaciones por defecto que quiero burlarme, que en este caso, es esta publicación de subida. Con esto, estoy diciendo que siempre que al módulo predeterminado de este módulo APIs, haya llamado al módulo predeterminado de este módulo APIs, que es upload post, no quiero ejecutar el código real dentro de él. Yo sólo quiero devolver un valor de marca para mí. Qué hace esta función cuando la API llama, será exitosa, devolverá el post. Simplemente voy a pasar el poste de marca que he creado. Y de esta manera, puedo decir que siempre que se haya llamado a esta API, por favor no vayas a Axios, no ejecutes el código, devuélveme este objeto Y con el espía encendido, en realidad podemos ver si se ha llamado a este método, cuántas veces se ha cortado con qué parámetros se han llamado. Así vuelve en versión espía, una muy bien, que guardé y lo llamaré subir post Spy. Y ahora quiero llamar y realmente llamar a mi mutación. En lugar de usar la fuerza, voy a cambiar esto para usar create force y voy importar esto y el wrapper con el mismo así que estoy renderizando este gancho. Para llamar a la mutación, voy a llamar a resultados esa corriente que mutan y voy a pasar marca Post Y voy a necesitar el peso para el bloque, pero habrá una diferencia. Voy a probar es que voy a esperar que mi SPI haya sido llamado y también su nos proporciona haber sido llamados tiempos Estoy esperando que se le haya llamado una vez. Aquí tengo un error porque estoy pasando el tiempo de marca. Veamos el post de creación. Entonces cuando estamos llamando cuando se ha llamado a la mutación, el parámetro es cuatro datos, así que debo pasar los cuatro datos. Así que arreglemos eso. Permítanme crear los datos de post de marca, que serán tipo de datos de formulario. Y permítanme adjuntar a esto un título, una identificación, que será uno y una descripción, que será descripción. Y cuando estoy llamando al mutado, necesito pasar este Mk post data Veamos juntos lo que está pasando. Estoy creando un objeto de datos de formulario. Estoy reemplazando la importación por defecto del APS, que es Upload force upload post con la versión Spy y estoy diciendo por favor devuélveme el post Mk que he creado anteriormente, y este es el Spy. Ahora quiero renderizar mi mutación. Siempre que se llame al mutado con estos datos de formulario, estoy esperando que se llame a la API Vamos a hacer la prueba. Y maravilloso. La prueba está pasando. Entonces si cambio esto, por ejemplo, a dos, esto es definitivamente debería fallar porque debería haber, como pueden ver, dice que tiene esperando que se llame dos veces, pero se le ha llamado alta. Y mi condición para esta prueba no solo debería ser también que se haya llamado a esta función, sino que estoy esperando que también hayan llamado con los parámetros adecuados. Entonces hay otra función, y haber sido llamada VD. De esta manera, también puedo probar que en realidad qué parámetros, función espía versión de esta función ha sido llamada. Voy a ejecutar la prueba y ahora la prueba está pasando 25. Prueba de escritura para usar CreatePost (parte 2): Entonces la primera, la primera parte de la prueba ya se ha hecho, escribimos la primera prueba con respecto al uso create pause, que estaba relacionado con la función de mutación, que es upload pause. Ahora queremos probar este éxito. ¿Qué hace esto? Esto realmente lee el cliente de consulta de este archivo y luego llama a las consultas invalidadas con esta clave de consulta Queremos asegurarnos de que antes que nada, siempre que se haya llamado a esta mutación sobre el éxito de esta mutación, se llamarán consultas invalidadas y además pasará los parámetros correctos Déjanos hacerlo. Simplemente voy a copiar esta prueba y luego empezaré cambiar lo que necesito cambiar para esto. Permítame también cambiar la descripción. Escribiré consultas invalidadas y éxito. Los datos del formulario permanecen, el gancho de renderizado permanece, la mutación permanece. Aquí, en lugar de probar, también quiero crear un spi para esta querclina porque también estamos importando desde una Vamos al archivo superior y vamos a importar ts query client Estoy importando este cliente de consulta y aquí también voy a crear otro espía aquí. Para este espía voy a usar este módulo y el método que quiero crear un Pi son las consultas invalidadas Aquí también puedo escribir valor de retorno, marcar valor de resultado, pero para esta prueba, no me interesa lo que está regresando con esta función. Solo quiero tener un SPI como su nombre indica Spy significa espiar Solo quiero asegurarme de que después de esta mutación, esta consulta invalidada haya sido capturada y haya sido llamada con los parámetros correctos Lo definiré como invalidar consultas espía. Dentro de mi expectativa, estoy esperando que ese espía de consulta invalidado haya sido llamado una vez Hagamos la prueba. Y ahora veremos que la prueba está fallando, así que depuremos juntos lo que está sucediendo. Aquí tengo éxito, aquí tenemos la consulta inválida. Mi mal, esto fue un error. Cuando veo la referencia de esta línea de consulta, esto es en realidad va a esta variable que he definido aquí. También siempre es bueno a veces mostrar errores a los que nos enfrentamos. No es así cada vez que empiezo a codificar, todo funciona perfectamente. Verán que esta línea ha sido cubierta porque por error, he usado la misma. Vamos y llamemos este módulo cliente cuérico, por ejemplo, dentro de nuestro Spi esperamos que realmente caduque en este módulo y luego hagamos la prueba Ahora maravilloso está pasando. Ahora también tengo un error tipográfico aquí. Ahora estoy seguro de que esto se está cortando y también queremos asegurarnos de que a se ha llamado con los parámetros correctos. Voy a dejar que falle la prueba porque estamos seguros de que ésta no es una. Veamos el mensaje de error. Entonces ahora ves que la prueba está fallando porque espera realmente recibir un objeto desde la clave de consulta hasta las publicaciones. Entonces, como puedes ver, el objeto que pasa es query key posts. Entonces voy a cambiar esto, arreglemos esto por cliente de consulta y no cliente de consulta, clave de consulta, y el valor debe ser publicaciones. Y volvamos a ejecutar la prueba y veamos query y también debería ser un array porque también estamos pasando un array y no solo string. Veamos increíble. Ahora nuestra prueba está pasando por escribir esta prueba, ahora me aseguro de que si algún desarrollador viene por error, por ejemplo, agrega algo a esto. Ahora tengo una prueba que fallará y evitará que esto suceda. Y este es el beneficio de tener pruebas unitarias y pruebas automatizadas. Si por ejemplo, viene otro desarrollador y por error elimina estas líneas de código o cambia eso, esta prueba también fallará. Siempre estamos seguros de que todo va a funcionar como se esperaba. Ahora que tenemos la prueba también vamos a correr todo el bloque con la cobertura para ver nuestro reporte de cobertura de código. Y vamos a aplicar y déjanos ir frescos esto. Maravilloso. Ahora, verás que realmente usar Create Post tiene una cobertura del 100%, esta prueba todo este archivo ha sido cubierto por nuestras pruebas. Entraré y empujaré mis cambios y continuaré mi trabajo escribiendo pruebas para usar editar y usar eliminar. 26. Pruebas unitarias para su usoEditarPublicar y usarEliminarPublicar: Agregué otras dos pruebas para los otros hooks, uso edit post y use delete post y la mayoría de los códigos fueron similares. Por lo que te recomiendo encarecidamente hacer una pausa en el video, tratar de escribir la prueba. Puedes usar las otras pruebas que escribí, usar Epos y luego aprenderlo de él y escribir la prueba Por ejemplo, hay algunos pequeños cambios, pero también es una muy buena práctica que lo hagas por ti mismo. Por ejemplo, aquí en editar post en nuestro sucton estamos invalidando dos consultas Primero está el relativo a la lista de la pose y el segundo es el relativo al ID de ese post específico que se ha editado la forma en que podemos probar esto es que puedo llamar puedo pedir que quiero que esto se llame dos veces, y quiero que se llame una vez con los posts como matriz y también una vez con el post e ID uno, que es ID uno es el ID de este post. Y ahora tenemos una muy buena prueba para todas estas carpetas. Así que vayamos y hagamos todas nuestras pruebas y déjenos y veamos toda la cobertura del proyecto. También lo puedo hacer en la terminal. Entonces, si no está utilizando la tienda web, podemos ejecutar NPEG con cobertura de Rundah Y aquí si vuelvo de nuevo a mi navegador, también puedo ver en mi terminal. Pero si vuelvo aquí, ahora verán que en realidad nuestra API está 100% cubierta, nuestras constantes y hostiles, todos estos ganchos que he creado, todos ellos han sido cubiertos al 100% Entonces toda la declaración, todas las ramas, todas las líneas y todo ha sido cubierto. Y para este módulo, no creé pruebas externas para estos archivos, y esa es la razón por la que no se han cubierto. Y por ahora, podemos ignorarlo y esto no es importante para nosotros en estos momentos. Pero hay un problema con la prueba, y podemos mejorar nuestro test un poco más. Ahora es realmente bueno que tengamos una cobertura del 100% para casi todo y también podemos ejecutar esto aquí para que también lo veas dentro de nuestro ID. Aquí verás que todos estos archivos han sido cubiertos al 100% con las pruebas. Pero hay otra mejora que podemos hacer para mejorar nuestras pruebas. En el siguiente módulo, voy a hablar de eso. 27. Haz pruebas de fábricas y sus beneficios: Hay algunas mejoras que podemos hacer para tener mejores pruebas. Imagínese aquí, hemos agregado tantas pruebas, por ejemplo, para uso creado. Usa create post, tengo un post marcado, que es tipo post type y tengo un objeto codificado duro aquí. Uso interior editar post, esto también es lo mismo por dentro, use post. Nuevamente, tenemos un post marcado, que es un objeto codificado duro dentro, use posts tienen una matriz que contiene solo un objeto y este objeto también es un objeto codificado duro. Esta es una definición de tipo. Imagina que estás trabajando en el producto de producción y después a veces hay un nuevo requisito para el cliente, desde el equipo de desarrollo de negocios o desde el equipo de soporte que cada puesto debe tener otro campo. Por ejemplo, el número de los me gusta o el número de los comentarios para esta publicación o una matriz de los comentarios. Y para poder soportar eso, debemos y la API primero proporcionará esos datos e imaginemos si queremos implementarlos. Entonces por ejemplo, número de comentarios. La forma en que lo implementaremos es que cambiaremos nuestro tipo y agregaremos este parámetro a eso. Pero ahora, todas nuestras pruebas tenemos este problema que debido a que estos valores, esto tiene este campo no existía en el tiempo que escribimos las pruebas, ahora deberíamos actualizar todas las pruebas nuevamente, la propiedad no existe y también podemos ver en uso crear pose. Este es un problema que podemos resolverlo mediante el uso de fábricas de prueba. Con las fábricas de prueba, en lugar de codificar duro un objeto, voy a definir una función que me devuelva un objeto, y este es el objeto de prueba, y luego podemos cambiar nuestra implementación de tal manera que estas pruebas solo usen esa fábrica y no sean dependientes. No están codificando duro en el ajuste. Hagámoslo. Voy a crear una carpeta, lo haré dentro de SRC, lo llamaré fábricas de prueba Dentro de test factory, voy a crear un nuevo archivo y lo voy a llamar post factory punto ps. Dentro de este archivo, voy a definir una función. Yo lo llamo lo llamaré, por ejemplo, get test post, que es una función que devuelve un tipo post y el valor de retorno para esta función será el tipo post. La definición sería, simplemente puedo devolver este objeto, por ejemplo. También necesitaré importar el tipo de poste. Incluso puedo hacer que sea realmente simple una línea con esto porque solo devuelvo un objeto. Vamos y por ahora, primero eliminemos este tipo para deshacernos de este error. Y ahora tengo una función que en realidad devuelve un objeto de prueba. Iré y dentro de todas las pruebas que he creado para la API. Me voy y en vez de esto, sólo voy a llamar a esta función. Puesto de prueba. Dentro de mi fábrica, también necesito exportar poste de prueba predeterminado. Aquí sólo voy a llamar a esta función. H. Y dentro de mi edit post, haré también lo mismo. Dentro del poste de uso, también reemplazaré este objeto codificado duro con poste de prueba KD y también lo importaré. Aquí creo que me olvidé de importarlo. Importemos también este dentro de mi post de uso, también reemplazaré esto con get test boost y también necesito importarlo. También pueden simplificar esto a esto hagamos todas las pruebas para asegurarnos de que no dirigimos nada y maravilloso. Ahora todas las pruebas están pasando ahora si la API está cambiando y por ejemplo, si necesitamos agregar un neopl, el único lugar al que necesito agregar esto será aquí Por ejemplo, voy a ir. Ahora otra vez, ninguna de mis pruebas necesita ser actualizada. Ninguno de estos cambios. Es necesario que se haga. Yo sólo voy a poner el valor aquí. Mantengámoslo tal como está. Perfecto. Este es el concepto de la fábrica y la fábrica es un patrón de diseño en ingeniería de software y el factor de prueba se llama cuando estamos usando fábricas, algunas funciones que nos genera un objeto y vamos utilizar este objeto dentro de nuestras pruebas de esta manera, estamos separando la definición de dominio de nuestra prueba. Si algo dentro de nuestros dominios necesita cambiar en el futuro, no necesitamos actualizar todas nuestras pruebas. Solo necesitamos actualizar nuestra fábrica. 28. Introducción a FakerJs: Otra mejora que podemos hacer para nuestra prueba es que como puedes ver aquí, codificé duro algunos valores como el objeto de prueba. Pero en la vida real y en entornos de producción, los usuarios utilizarán nuestro software con diferentes conjuntos de datos. Este conjunto de datos puede tener algunos caracteres especiales. Entonces H casos pueden ocurrir con la cadena con números y muchos de estos casos pueden ocurrir, pero si solo tenemos un objeto con valores codificados, y esto no puede probar toda la solución posible, todas estas posibles situaciones que pueden suceder. Para abordar ese tema, vamos a usar la biblioteca fakare, y FAKregs es una biblioteca que genera datos que imita valores del mundo real como nombres, direcciones, fecha, cualquier cosa sobre el correo electrónico, cualquier cosa sobre, por ejemplo, un nombre de la persona, un nombre de una empresa y cosas así. van a cambiar test, factory para usar faker con el fin de generar y obtener un objeto de prueba que en realidad es un objeto del mundo real en lugar de codificar valor Hay beneficios. Lo primero es que podemos tener datos dinámicos y realistas. Y también hay beneficios con cara que podemos crear fácilmente arreglos y tener múltiples entradas que estas entradas no están oplicadas En mi caso cuando tenemos use post cuando creamos una prueba para usar post, acabo de crear una matriz con un elemento. Pero con Faker Js, puedo crear fácilmente múltiples objetos y múltiples matrices, cual es más realista a lo que quiero probar Y además nos proporciona una mejor cobertura de prueba porque los datos son aleatorios. Puede contener un carácter especial, puede contener Hcases Si estás trabajando con números, nos proporciona números negativos, positivos y todas estas cosas se pueden poner en nuestra prueba y en realidad nuestra prueba es probar los datos del mundo real. También nos proporciona una forma de evitar los valores de codificación dura. En el siguiente video, voy a instalar faker Js y voy a cambiar nuestra prueba para usar Faker 29. Cómo usar FakerJS con Post Factory: Entonces comencemos con trabajar con Facare. Puedes ver el sitio web oficial de facare en fakjs punto v. Aquí, verás que tienen diferentes módulos para persona, ubicación, fecha, finanzas, comercio y Voy a ir a empezar y aquí para la instalación, sólo voy a copiar esto y esto es lo que necesitamos. Voy a nuestra terminal. Nuevamente, debido a que toda la prueba es solo para desarrollo, esta se instalará como solo una dependencia dev. Ahora que se ha instalado Facure, me voy y voy a importar fac poder importarlo desde el paquete Voy a escribir FacimPortFakre, de Fakre Js. En lugar de codificar duro el número uno para la identificación, voy a usar tarifa, ese tipo de datos, tipo de datos de tarifa, número o número de tarifa. Eso es. Esta línea en realidad me devuelve un número aleatorio. Tengo un tema de tormenta climatológica que no es importante. Eso no lo entendí. Ya lo instalo, pero podemos ignorarlo. Para Titan, voy a usar cadena aleatoria. Voy a usar Fac Lorem esa frase para descripción, voy a usar para generar un párrafo aleatorio y esta vez, iré con Para creado ese farsante proporciona mucho ayudante para trabajar con fechas Voy con faker, esas fechas y porque quiero usar un tiempo reciente, hay una función auxiliar reciente que devuelve una reciente y voy a convertirla a Iosring porque nuestra definición de tipo es Y para nuestra URL tR, necesitamos una URL de imagen aleatoria, así que voy a usar la imagen de la imagen o módulo del faker, y para el nombre, el nombre debe ser el nombre de la persona Voy a nombrar y sólo voy a usar el nombre de pila. Creo que esto ha quedado desaprobado veamos creo que dice usar persona en lugar de dejarnos ir y elegir el nombre y también puedes usar el nombre completo para Para la imagen, nuevamente, lo único que para nosotros es importante es la URL, así que solo voy a crear una URL para la fecha de publicación. Iré y saldré. Esta vez voy a usar un pasado. Un pasado significa que se ha pasado en alguna fecha en el pasado. Debido a que es String, lo voy a convertir en anillo y para número, voy de nuevo a usar un entero. También tenemos algunas opciones. Por ejemplo, puedo proporcionar media y max porque por ejemplo, sé que el número de los comentarios siempre es un número positivo, así que voy a usar un valor mínimo de cuatro Z. Y ahora verás que cada vez que esta función cuando se llame a esta función, estamos obteniendo un nuevo objeto y este objeto no tiene valores codificados duros y es con algunos reales datos y se ha llenado con datos reales. Ahora que tenemos el falso, también puedo entrar dentro de mi post de uso y aquí en vez de codificar duro solo un valor, puedo usar una matriz del faker Faker también proporciona una manera fácil de generar realmente múltiples datos En este caso, solo voy y estoy usando array dot From. Voy a pasar un objeto que la longitud sería, por ejemplo, diez y dentro y voy a pasar la función de flecha y dentro de eso voy a usar esto. De esta manera, también puedo en realidad, cuando tengo una matriz, también puedo reemplazar esto con un dato más realista. Ejecutemos esta prueba y asegurémonos de que esta prueba también esté funcionando. También puedo hacerlo mejor en vez de tener una longitud fija, también puedo ir y puedo usar con faker y luego puedo ir a número y tinta con algo, por ejemplo, mínimo uno y dejarme también importar fake Y el máximo sería, por ejemplo, 20. Sólo necesito arreglarlo. De esta manera, en realidad estoy probando mi código con datos reales y cada vez que obtengo una matriz aleatoria que contiene todos los objetos aleatorios. Vayamos a la terminal y hagamos todas las pruebas para asegurarnos de que todo sigue funcionando. Perfecto. Bien. 30. Resumen del módulo de prueba unitaria: Todo bien. Enhorabuena. terminado este módulo, que era relativo a las pruebas unitarias. Hemos cubierto una gran cantidad de temas. Primero, comenzamos a hablar de VTST, instalamos y configuramos VTS, y luego hablamos sobre la cobertura de código, diferentes métricas que existen en cobertura de código como líneas, ramas, declaración, función, y también discutimos sobre las diferencias entre la cobertura de código y la cobertura Y luego indagamos en la codificación, y luego agregamos alguna prueba unitaria. Primero, escribimos alguna prueba unitaria simple, y luego hablamos del concepto avanzado en pruebas unitarias como marcar y también usar Spy con el método de espiar invitaciones, y agregamos algunas pruebas unitarias. También para cada prueba unitaria, calculamos la cobertura de cotización para asegurarnos de que probaremos todas las opciones posibles. Y luego después de eso, comenzamos a mejorar nuestra prueba con el uso de las fábricas de prueba. Hablamos de la fábrica. ¿Cuál es la definición de fábrica de pruebas? Y hemos creado una fábrica de correos para nuestro proyecto. Y en el último módulo, también hablamos de faker Jes, y usamos faker para generar datos realistas para nuestros casos de prueba Este módulo era un módulo muy, muy bueno que has terminado, y ahora tienes una muy buena comprensión de las pruebas unitarias. También te animo si algunas de las partes no te fueron claras, siempre puedes volver a estos videos y volver a verlos. O también puedes terminar el curso. Y cuando hayas visto todos los videos para las futuras referencias, siempre podrás regresar. A lo mejor algunas de las partes serán más claras para ti si terminas primero el curso. Pero enhorabuena a ti. Hiciste un gran trabajo. Entonces tal vez puedas tomarte un café y tomarte un descanso, y entonces estaré feliz de verte en la próxima conferencia. 31. Introducción a las pruebas de integración: Enhorabuena por el acabado de la última sección sobre pruebas unitarias. En este módulo, vamos a platicar y trabajar sobre pruebas de integración. Hagamos un resumen sobre lo que son las pruebas de integración. Como dijimos anteriormente, las pruebas unitarias se centran en una unidad como una función o una clase como hicimos en el módulo anterior. Por ejemplo, comenzamos a escribir pruebas para una sola unidad, y para las otras unidades, usamos el marcado y espionaje para reemplazarlas con la versión marcada y espiada Entonces nuestro enfoque fue solo un movimiento. Y en las pruebas de integración, vamos a probar la integridad entre diferentes componentes y diferentes movimientos. Y si volvemos atrás y si miramos la pirámide de pruebas, pruebas de integración están en el medio. Entonces no son tantos como la prueba unitaria. Siguen siendo más rápidas que las pruebas, pero más lentas que las pruebas unitarias, y escribirlas es un poco más desafiante. Por lo que no son tan fáciles como baratas como las pruebas unitarias, pero aún son más fáciles para escribir dos pruebas. En este módulo, vamos a utilizar la biblioteca de pruebas de reacción para escribir pruebas de integración. Y primero, configuraremos esta herramienta y luego trabajaremos con esta herramienta para escribir prueba de integración. 32. Configuración del entorno para las pruebas de integración: Entonces comencemos a escribir nuestra primera prueba. Primero, necesitamos instalar las dependencias requeridas para la biblioteca de pruebas de reacción Voy a mostrar el paquete que Jason archivó y aquí voy a probar voy a buscar biblioteca de pruebas. Del video anterior, agregamos el volcado de biblioteca de pruebas. Simplemente no reacciones y eventos de usuario. Entonces ya tenemos las dependencias dentro de nuestro proyecto, y podemos comenzar a escribir nuestra prueba Pero para la configuración, también necesitamos cambiar nuestra configuración de TI. Veamos nuestro con conf. Aquí agregamos una sección de prueba, establecemos suturu global y establecemos el entorno a la JS Aquí también agregaré otra línea y agregaré una clave que es archivos de configuración y la voy a pasar a SRC slash Setup Dentro de mi configuración, voy a crear un archivo, crea un archivo mecanografiado con Dentro del archivo de configuración, voy a importar la biblioteca de pruebas JSA Voy a poner esta línea. Este es el esto realmente ayuda que cuando estamos usando algunas coincidencias como estar en el documento, lo hace disponible globalmente, para que podamos identificar nuestro ID entender y también podemos usarlos. Y para nuestro primer componente, para nuestra primera prueba, vayamos y escribamos dentro de nuestra carpeta para compartir. Contamos con una carpeta de componentes. Tenemos un archivo de índice, y quiero escribir mi primera prueba de integración para este componente. ¿Y qué hace este componente? En realidad, cuando estamos visitando nuestro sitio web, cuando estamos en la página principal de nuestro sitio web, tenemos un componente de publicación, y cuando haga clic en eso, verá la imagen de este post, la descripción de la pose y la persona que escribió este post. Como puedes ver, ya tenemos un bug aquí. Aquí, la imagen está equivocada y esto es si soy el escritor de este post, entonces la imagen debería ser corregida. Para este, voy quiero agregar una prueba para este componente. Veamos en el código fuente, va a tener un cospose que es un tipo de pose tipo y aquí estamos leyendo imagen y título del post y luego tenemos una tarjeta de estilo, que es un elemento y diseño Entonces aquí estamos configurando Avatar, avatar es un valor codificado duro y el título del post. Qué voy a probar, voy a probar eso en realidad cuando visite esta prueba, quiero ver una imagen con la t. quiero ver quiero asegurarme de que esta URL de publicación, la URL de la imagen es el valor correcto y también quiero asegurarme de que voy a ver el avatar correcto y también quiero asegurarme de que voy a ver el título correcto para esta prueba. Entonces hagamos esto en el siguiente video hasta ahora describo cómo vamos para qué componente, vamos a agregar una prueba y en el siguiente video, voy a escribir prueba para este componente. 33. Escribir la primera prueba de integración: Para escribir la prueba, voy y voy a crear un archivo, que lo llamo índice que prueba ese Tsix Voy a usar el bloque describir exacto y vamos a probar nuestro componente post. Después voy a añadir describir, yo diría, renderiza la imagen del post o post title. Probablemente aquí voy a agregar esto. Lo que vamos a hacer es que primero vamos a obtener este componente y renderizarlo dentro de la página y luego veremos qué está pasando con este renderizado. Para eso, vamos a utilizar una función de render que es proporcionada por la biblioteca de pruebas de reacción. Voy a importar render de testing library react. Dentro del render, en realidad puedo como un componente de reacción completo, y también necesitaré importar esto. Mi condición para la prueba sería que también puedo tener otra función de la biblioteca de pruebas de reacción que es una pantalla. Aquí puedo pedir desde pantalla que estoy esperando obtener por texto para estar en el documento. Voy a poner esto en una expectativa y luego estoy esperando estar en el documento. Lo que espero ver, estoy esperando cuando estoy renderizando un componente post, estoy esperando cuando vea la fuente estoy esperando que deba tener el título de este texto para ser mostrado. También voy a ver un error aquí porque nuestro componente post realmente espera que se reciba un objeto post. Vamos y primero creamos un objeto post y podremos usar nuestras fábricas para obtener un post aleatorio aquí voy a pasar esto a este componente, y ahora espero que ese post el título esté dentro de este documento. React testing library renders this component with this variable and then my condition for test would be that I am expecting that the title of this text to be sin Hagamos la prueba. Ahora veremos una flecha que en realidad dice ventanas que coinciden con los medios no es una función. Primero arreglemos esta flecha. 34. JSDom vs. entorno del navegador: Entonces, ¿qué es este error y por qué sucede esto? Para renderizar el componente, necesitamos un navegador. En realidad, cuando implementamos un proyecto react, browser ejecuta nuestro código fuente Javascript y luego renderiza el componente Pero cuando estamos haciendo pruebas con la biblioteca react testing, no tenemos el navegador y por eso, estamos usando JSTO Y JSDOM es implementación es una implementación JavaScript de Dom y HTM, y simula un entorno similar a un navegador Pero hay algunos casos en los que no todas las funciones que existen dentro del Navegador también existen dentro del JST aquí es el caso de que cuando estoy corriendo desde el navegador, estamos esperando ver un medio coincidente y por qué esto está sucediendo porque estoy usando t design como biblioteca de UI y Aunt design usa esta función internamente y cuando funciona dentro del navegador, está bien Pero cuando estoy ejecutando esta prueba contra JS Done en un entorno simulado, esta variable no existe. Cómo podemos resolver este problema. Esto ya lo aprendimos de los videos anteriores. Podemos marcar esta función, lo que significa que en realidad no necesitamos esta función, solo necesitamos pasar algo que imita el comportamiento de esta función Y para ello, como ustedes recuerdan, he creado un conjunto del archivo Ts, que estamos importando recién hecho. Aquí también puedo definir una versión simulada de la función. Aquí agregué este código y estoy diciendo que si ventanas que coinciden con los medios no es igual función, lo que significa que si esto no existe, voy a definir esta función. Esta función devuelve un objeto y la mayoría de estos objetos son nulos, las funciones, las he reemplazado por funciones vacías que no hacen nada, pero solo da esto cuando Como diseño quiere usar, simplemente lo hace disponible dentro del JSTo Añadamos esto y volvamos y hagamos nuestra prueba. Y maravilloso. Ahora nuestra prueba está pasando. 35. Terminar las pruebas de integración para PostComponent: Entonces hasta ahora, acabo de probar que puedo ver el título del post correctamente. Entonces veamos el componente, qué hace realmente este componente. Tiene una portada que es esta imagen como imagen destacada. Y esta imagen tiene un título como atributo alt que si lo siento, si muevo el mouse sobre él y si inspecciono sobre esto, puedo ver que aquí tengo el título del post como atributo alt. También cuenta con el SRC de la imagen. También quiero probar que mi componente post también renderiza la imagen correctamente. Agreguemos también una prueba para ello y dejemos a la derecha renders la imagen destacada de los posts, y también voy a añadir. Para el inicio, también volveré a usar el Voy a conseguir una fábrica para mi puesto. Voy a renderizar mi componente con biblioteca de pruebas de reacción. Aquí ahora podemos usar otra función auxiliar de la biblioteca de pruebas de reacción, que es G por texto Alt. Voy a decir get by Alt text, lo que significa obtener por texto alternativo. Voy a esperar que voy a llamar a esto como una imagen. En primer lugar, espero que esta imagen esté dentro del documento. Estar en el doc. Estoy esperando que mi componente renderice una imagen y segundo de todo, estoy esperando que esta imagen tenga atributo para el SRC Para eso, también puedo usar esta función auxiliar para Estoy esperando el SRC sea post image dot R. Primero, quiero asegurarme de que la imagen se haya renderizado correctamente y también quiero asegurarme de que el post tenga la imagen correcta Hagamos esta prueba. Y maravilloso ahora nuestra prueba está fallando. Si vengo aquí y si, por ejemplo, quite estas líneas. Ahora, estoy seguro de que hay una prueba que fallará porque ahora cuando renderizamos estos componentes, biblioteca de pruebas dice incapaz encontrar un elemento con el texto alternativo. Y aquí verás un valor aleatorio y esto es exactamente lo que discutimos sobre las características y sobre los valores. Probemos también el metal que en realidad estamos esperando ver una obertura Ya probamos este, así que voy a copiar este bloque. Y voy a renderizar el avatar completo ter avatar y elijo slash Te y vamos a hacerlo con más bonita, mejor Vamos a usar códigos dobles aquí y eso es lo que estás diciendo tu código. Aquí ahora estoy esperando de nuevo, lo que voy a buscar. Aquí puedo usar otra función helfare que pueda usar para buscar una publicación por su nombre de rol Hay otra otra función, obtener todo por rol. Aquí puedo pasar una imagen. Yo diría que quiero ver todas las imágenes. Cuando estoy usando get all by role, significa que estoy consiguiendo todas las imágenes y como puedes ver primero, tengo esta imagen y también hay otra puerta. Esto será una matriz. Estoy esperando así que llamemos a estas imágenes, y espero que las imágenes tengan una longitud de dos. Estoy esperando primero ver dos imágenes y para el 01, ya agrego una prueba para la primera, estoy esperando que esta tenga el post correcto ¿qué fue? El en ese AvaTorr. Para el SRC, para la segunda imagen, que es el índice de uno, estoy esperando ver el avatar uR Hagamos la prueba. Y ahora verás que la prueba está fallando. Entonces veamos incapaz de encontrar un elemento. Aquí están los accesibles. Lo siento, me equivoqué. El nombre del rol debe ser IMG. Yo lo reemplazaré. Realicemos de nuevo la prueba. Y ahora veremos que en realidad nuestra prueba está fallando, por lo que no se cumple el elemento que SRC, esta condición Esto es porque sabemos que ya tenemos este bug porque la URL es otra cosa. Esta es la URL codificada. Primero, arreglemos nuestro código. Reemplacemos esto con post, AatorRn y veamos que en realidad nuestro sitio web ha sido actualizado el aur ing es correcto Arreglemos esto con más guapa. Llevemos esto a Internet. Ahora esta vez debería pasar la prueba. Maravilloso. 36. Informe de cobertura de código para PostComponent: Y exactamente como las pruebas unitarias, también podemos calcular la cobertura para esta prueba. Entonces me lo voy a esperar. Y aquí, voy a correr post con cobertura. Y primero, correrá todas estas tres pruebas, y todas ellas están pasando. Y lo volveré a ejecutar. A veces hay un problema que en la primera vez no calcula la cobertura. Así que vamos a asegurarnos de que voy a obtener el valor correcto para la cobertura, y estamos en el postfolo compartido SRC Pasemos al reporte de cobertura, volvamos al expediente antiguo. Estamos en la sombra SRC y aquí dirás que fonder tenemos 100% de cobertura para este archivo 37. Prueba de integración de escritura para el componente de pie de página: Continuemos nuestro trabajo escribiendo una prueba para el componente del pie. ¿Qué es un componente de pie de página? Es solo un pie estilo es un pie que ha sido envuelto con el texto Ali center y muestra un mensaje sencillo. Si queremos verlo dentro de nuestra página web, veremos que este es el componente footer. Voy a crear un nuevo archivo para esto. Yo lo llamaré prueba de índice. T six y voy a describir block y el bloque describe sería para el componente completo y necesito una función de flecha aquí, y también necesito un bloque aquí, así que diré renders full correctamente, y también necesito una función de flecha aquí. Y tengo un tipo aquí. Siempre es bueno que cuando estás aprendiendo una nueva tecnología, una nueva biblioteca o un nuevo marco para practicar el mismo concepto dos veces. Para probar este componente, este es un componente simple, por lo que solo necesitamos asegurarnos de que esta línea y esta se muestre correctamente. Para eso, voy a usar render footere y voy a importar componente footer Voy a importarlo de mi propia carpeta no de ahí. Diseño y también voy a importar un render de pantalla de la biblioteca de pruebas de reacción y también la pantalla. Mi condición para esta prueba sería simple. Espero que este texto dentro de mi documento esté en el documento. Voy a copiar este texto y sólo voy a pasarlo aquí. Hagamos la prueba. Ahora verás que en realidad la prueba está fallando porque esto ha sido renderizado como lo tenemos dentro de nuestro componente, tenemos un perno y con el fin de asegurarnos de que está escribiendo propiedades, así voy a usar estas dos secciones. Estoy esperando ver este texto y esperaba ver este texto. Permítanme simplemente duplicar esta línea y para la primera condición, espero ver este texto y para esta, espero también ver esta línea. Vamos a arreglarlo bonito aquí y dejémonos rojos en la prueba. Y maravilloso. Ahora, la prueba está pasando. Como siempre, si un desarrollador por error viene y pone aquí algo, estamos seguros de que encontraremos el error relacionado con esta prueba y además dejemos correr la cobertura y estoy esperando una cobertura del 100% porque esta es solo una línea de código. Si lo vemos aquí, regresemos y vayamos a refrescar esta página. Tenemos el componente pie de página y aquí veremos una cobertura de código 100%. 38. Prueba de integración por redacción para la página de contacto: Entonces hasta ahora, agregué una prueba para este componente para este componente post y también para el Foote, pero no probé toda la página La prueba de integración que escribimos para los componentes post nos aseguramos de que el componente se renderizará correctamente. Pero esta página, si queremos probar esta página, queremos asegurarnos de que cuando estemos en la raíz de nuestro sitio web, veremos todos los posts que vienen de la API, y luego también veremos los componentes de pie de página y también queremos asegurarnos de que esto también funcione. Es un poco más complicado, vayamos y primero escribamos para la prueba para la página acerca de y para la página de contacto porque son más simples página estática y es más fácil escribir prueba. Primero, por ejemplo, vayamos y empecemos a escribir una prueba para la página de contacto. Dentro de la página de contacto, verás que agregué un texto que si tienes alguna sugerencia, por favor agrégame un texto. Creo que tengo un tengo algún enlace ES y errores tipográficos y cosas así Me agregué una dirección de correo electrónico y mi informe de Github y también mi enlace. Vamos a crear una prueba para esto. Vamos a llamarlo página de contacto que prueba ese seis, vamos a describir y describir será sobre la página de contacto? No sé, oí. Voy a añadir muestra el peop enlazado en enlaces correctamente. Para ello, voy a renderizar mi componente de página de contacto. Voy a importar este componente. También importo la función de render de la biblioteca de pruebas, y también estoy importando una pantalla y aquí mi condición sería que estoy esperando obtener mi dirección de correo electrónico dentro del texto y lo que va a estar dentro de los documentos. Lo que voy a decir, por ejemplo, quiero ver mi URL de LinkedIn aquí. Quiero asegurarme de que dentro de mi página de contacto, tengo el enlazado en URN y la URL es correcta. Ejecutemos esta prueba y veamos también que en realidad tenemos el enlace Github así que permítanme agregar también este para los GTUb También tengo un texto para la dirección de correo electrónico Asegurémonos también de que se renderizará el texto. Correcto. Aparte de eso, también tengo un párrafo. También tengo un contacto que es un H dos, también puedo agregar una prueba para eso. Puedo decir que la pantalla de resorte se pone por rumbo de rollo cuando espero que una partida tenga esto y espero que esto esté en documento y voy a esperar que esto esté en documentos. Aquí obtener por rollo excepto encabezado rol y el primer parámetro es el nombre, pero creo que va a fallar, así que eso es ayudar Porque en realidad esta tecnología no tiene el título, no tiene el nombre, pero lo que estoy buscando en realidad sería en realidad si busco encabezado, y quiero tener este texto, que es contacto. C. Puedo probarlo con esta función para tener texto cont. Ahora la prueba está pasando. Estoy seguro de que también puedo usarlo por pantalla ese texto y esperaba que estuviera en el documento. Pero aquí estoy agregando otra condición. También estoy comprobando que en realidad este texto existe y también este es un encabezado. Puedo probar todo el párrafo para esto. Yo diría que no es necesario, así podemos y podemos ignorar eso. Hasta ahora, acabo de probar que estos tes existen, pero en realidad todos son botones y tienen enlaces y tienen algunos íconos, así que también puedo agregar algunas pruebas para eso. Puedo venir y decir, puedo volver a usar pantalla get by roll y esto tiene el rollo butthead Estoy esperando ver en realidad los tres botones. Déjame separar esto, hagamos la prueba, se está desvaneciendo. Veamos que no podemos encontrar un elemento accesible con el rol. Veamos qué es lo que realmente reacciona probando biblioteca es renderizar. Como puede ver, han sido reemplazados por anclas. Son enlaces, son enlaces. Cuando tengamos el ancla, el rol será link. Déjame solo deslizar el enlace. Y encontró múltiples, debería decir obtener por fila. Ahora el nombre del rol es correcto, pero porque hay múltiples elementos, entonces debería decir get word. Ahora estoy seguro de que en realidad hay tres anclas por establecer Dentro de esta página hay tres anclas y ahora también puedo empezar a probarlas. Puedo definir esto como una variable. Y puedo decir, primero, necesito ver tres enlaces, y luego realmente puedo probar los enlaces para asegurarme de que son correctos. Entonces puedo esperar enlaces y para el primer enlace, tener en vez de, yo diría tener atributo y estoy esperando que el atributo de H ref para el primero sería correo a ese contacto en un programador D. Vamos a ejecutar esta prueba primero para asegurarnos de que la escribí correctamente. Perfecto. Está pasando. Añadamos también pruebas para el segundo y tercer enlace. El segundo enlace debería ser mi enlace Github y el tercer enlace debería estar vinculado. Yo también Dejemos que hagamos la prueba. Estoy maravillosa la prueba está pasando. Hagamos la prueba con cobertura para ver también el reporte de cobertura del código. Veamos la cobertura dentro de nuestra carpeta. Estamos en la carpeta de páginas laterales del SRC y aquí tenemos la página de contacto y se han cubierto todas las líneas de fuerza La cobertura del código también es buena. Con esta prueba, en realidad me estoy asegurando de que siempre mi página de contacto sea válida y correcta. 39. Prueba de integración de redacción para la página Acerca de: También agregué una prueba para la página A. En este video, no voy y no lo escribiré porque también es similar al video anterior. Te animo a que escribas tú mismo la prueba. Por favor, pausa el video, escribe tú mismo la prueba y puedes compararlo con mi solución. Se trata de una página estética. Lo único que nos importa es este texto se muestre correctamente, y como pueden ver, tengo dos encabezados aquí relativos a la página de contacto que solo tiene un encabezado y para alguna de la prueba, no era tanto importante, así que agrego, pero solo quería asegurarme de que, por ejemplo, este párrafo es este párrafo también es salidas. Si ves la prueba como anterior, voy a renderizar la página. Voy a conseguir todos los rubros porque ahora tenemos dos encabezamientos para el primero Debería ser sobre este proyecto como podemos ver dentro de nuestro proyecto A para el segundo encabezado, debería ser el curso ta entonces estoy esperando ver el texto y la meta y el código base y también todas estas cosas. En realidad, ya hice la prueba para ésta, así puedo eliminar esta porque ya tenía esta prueba para el rumbo así también puedo eliminar esta prueba. Hagamos la prueba. Es una prueba fácil, por lo que todas ellas deberían estar pasando y dejarnos también correr con cobertura. Y veamos el reporte de cobertura de costos. Ahora también vemos que tenemos la cobertura del 100% para el sobre sabio. 40. Prueba de integración de redacción para página de blog (parte 1): Hasta ahora, las pruebas de integración que escribimos no tenían ninguna interacción. Solo estábamos renderizando un componente o renderizando una página y luego esperábamos ver el texto de prueba correcto dentro de la página o dentro de los componentes. Vamos ahora a escribir una prueba para un componente que es un poco más complicado con la página de bloques. Como puedes ver dentro de nuestra página de bloqueo, tenemos una lista de posts y cuando hago clic en esto, cuando el usuario hace clic, puedes ver los detalles de este post. Y ahora quiero agregar una prueba que en realidad también pone a prueba este comportamiento. Entonces queremos escribir una prueba para una página de bloque. Eso asegura que los componentes se renderizarán correctamente y también implica una interacción del usuario y que la interacción del usuario es hacer clic en una publicación y asegurarse que realmente esta página se renderizará. Cuando hacemos clic, estamos esperando ir a una página que es slash post slash dos y esto implica la interacción del usuario Vayamos y escribamos esta prueba. Vamos a crear un archivo. Yo lo llamaré. Página de registro, la prueba seis vamos a describir log. Para el primero, compartiría renders posts correctamente. Veamos el componente. Aquí de nuevo, estamos usando react query. Entonces para hacer eso, deberíamos volver a hacer el marcado y también deberíamos proporcionar algún post y aquí realmente podemos probar para ver si vemos el elemento post y también vemos el enlace y también lo veremos correctamente. Vamos y eliminemos la prueba unitaria que agregamos para la API. Aquí teníamos un post y teníamos un post de uso. La forma en que hicimos esto, fue lo que marcamos, creamos a partir de Faker, obtuvimos un número de 1-20 y para cada uno de ellos, era esta fábrica de pruebas la que estaba generando un post de prueba, y luego envolvimos todo el componente dentro la reacquery y luego estábamos probando Permítanme copiar esto como valores de publicación y vayamos a la página de entrada del blog. Déjanos hacerlo paso para que veas todo lo que está pasando. Primero, vamos a correr ahí nuestra página de blog. Corramos por ahora esta prueba y veamos qué va a pasar. Volvamos aquí, cerremos esto. Como puede ver, la primera será ninguna consulta cliente uso consulta proveedor cliente. Ya conocemos este error, así que voy a regresar y voy a usar realmente para usar un wrapper y voy a copiar toda esta línea y dentro de mi componente post, necesito primero renderizar un proveedor cliente de consulta. Porque esta página usa este componente y para el cliente, voy a usar clientes y ¿qué hemos hecho anteriormente? Era como si estuviéramos usando esto como cliente de consultas. Vamos a crear un cliente de consulta y pasárnoslo a éste. Hagamos ahora de nuevo la prueba. Vamos a arreglarlo también bonito, hagamos la prueba. Y ahora verás que la prueba está pasando porque no tenemos ninguna expectativa. Entonces ahora, vayamos y agreguemos una condición. Qué queremos esperar porque el componente de primera vez estará dentro del estado de carga, así que voy a esperar ver este texto. Entonces déjame agregar esperar aquí pantalla que se obtiene por texto, y estoy esperando que esté dentro del documento en el documento. Entonces, hagamos la prueba. Y la prueba está pasando, pero este no es mi propósito. Este no es mi objetivo. En realidad quiero hacer esperar hasta que se resuelva esta llamada a la API, y luego quiero asegurarme de que voy a ver todos los posts. Y claro, no me interesa la llamada API real y la llamada API con la interacción con el servidor. Quiero marcar esta publicación de uso de una manera que devuelva una matriz de esta publicación marcada, y luego quiero probar que en realidad si esta función devuelve el valor de recolección, ¿veo la página adecuada o no? Entonces hagámoslo y marquemos realmente esta publicación de us. Voy a importar esto. Yo voy a usar D tanto como antes usábamos, y voy a marcar todo este archivo y publicarnos Dentro de mi prueba, voy a decir que en realidad después de haber definido esta variable, estoy diciendo que estoy esperando usar publicaciones. Como marca para devolver siempre un valor fijo. También importo marca de su lo que sería el valor de retorno para el valor de retorno como esperábamos los datos, que necesitamos un dato, que se marcará porque estamos leyendo está cargando un error y está cargando debe ser falso y error debería ser no. Entonces estoy reemplazando toda la voz de uso, reemplazando toda la línea con algo arreglado. Y aquí, voy a marcar todo el módulo con este valor. Otra cosa que es importante porque en la página en realidad es una página que ha sido publicada lo siento, block page es un link y tenemos links dentro de este componente. También necesito envolver todo el componente en el router de memoria. También voy a añadir un recuerdo. Enrutador aquí y voy a usar el componente dentro porque cuando quieras usar un componente de enlace, siempre debes tener un router como fuera de alcance y voy a poner aquí un router de memoria. Ahora, estoy esperando que en realidad esta vez, espero que esta línea no esté en el documento porque estoy esperando que esta condición no se ejecute y en realidad estoy renderizando esto para componente. Primero probemos esta parte. Y la prueba está fallando, vamos a decir que no se puede encontrar un texto, y esto es exactamente lo que esperábamos. Pero aquí ahora, debería sustituir esto por consulta por texto. Solo estoy esperando esto o tener longitud cero. Porque cuando digo esperar, entonces consigue mi texto , busca este texto. Ahora estoy diciendo que en realidad si consultas por todo este texto, y consulta o si estás buscando esta prueba y dentro del componente render, no deberías ver nada y esto debería tener longitud z Ahora la prueba está pasando. Mi propósito era probar realmente para ver todos estos componentes y primero, quiero asegurarme de que en realidad la publicación se renderizará y también quiero asegurarme de que los enlaces sean correctos. Y ¿cuántos enlaces debo ver dentro? Será el número de los puestos que tengo. Voy a establecer y estoy diciendo que consiga todo mi rol y para el rol voy a usar Link, y estoy esperando que esto tenga el número de estos posts marcados. Yo diría puestos marcados, eso es todo. Porque lo que está pasando, le estoy diciendo a la consulta de reaccionar. Le estoy diciendo a esta línea que devuelva el valor fijo que es este falso, el número de las publicaciones falsas 1-20 y esto itera sobre todas estas pruebas Estoy esperando ver este número de estos enlaces dentro de mi componente. Veamos esto y esto también debería pasarse. Ahora que tengo esto, asegurémonos de que, por ejemplo, el primer post en realidad tenga un enlace correcto. Vamos a copiar esta línea y aquí voy a conseguir el primer elemento. Voy a probar que esta prueba realmente tiene el atributo SRC y HR y el atributo HR debe ser un post y el ID del post Déjame usar también la pantalla de plantillas. Debería ser post y el primer post ese ID, estoy seguro que este link debe tener este atributo extra. Volvamos a ejecutar la prueba y esto también debería pasar. Ahora me estoy asegurando de que en realidad haya un enlace. Si alguien viene y cambia este código fuente a algo así, aún los usuarios ven las publicaciones. Pero esto no es calculable, y esta prueba que agregamos en realidad se está asegurando de que debe haber enlaces y los enlaces también deben tener un atributo Hf correcto Volvamos hemos eliminado ahora, debería pasar la prueba Además, quiero asegurarme de que en realidad también se renderizará este componente post. Si lo vimos en el video anterior que tuvimos alguna prueba, también puedo traer todo eso, o puedo decir fácilmente porque tengo otra prueba para el puesto. Ya probé eso, así que solo necesito eso, por ejemplo, para ver en realidad el título. El título del texto deberá estar en el documento. Pongamos a prueba el apretado. Yo diría que te pongas por mensaje de texto y estoy esperando los puestos en el mercado. El primero que es título para estar en el documento. Con esto, me estoy asegurando de que en realidad se hayan renderizado los componentes del poste. Maravilloso. Ahora esto está pasando y esto funciona como se esperaba. Si quieres, también puedes ir y también agregar más condiciones para la URL oatoria y también la imagen Esto hace que la prueba sea aún mejor para probar eso. 41. Prueba de integración de redacción para página de blog (parte 2): Hasta ahora, he probado eso en realidad, puedo ver el contenido de esta página, pero hice una prueba de que en realidad el usuario puede interactuar con la página. Para ello, vamos a usar user event from react testing library, que es una biblioteca que me permite simular e imitar el comportamiento de un usuario, por ejemplo, hacer clic, ingresar un formulario y cosas así Entonces primero, vayamos a nuestro paquete, Jason. Ya existía, así que estamos probando el evento de usuario de biblioteca, pero es una versión antigua. Vamos a instalar la última versión de esta biblioteca y vamos a la terminal y vamos a ejecutar NPM install. Primero, voy a actualizar esta biblioteca y después voy a agregar una prueba que en realidad prueba el clic del usuario en la prueba. La mayor parte de la prueba será la misma. Voy a crear un conjunto de funciones aquí y voy a dejarnos crear un conjunto de funciones y queremos marcar todo el post y queremos tener el mismo método aleatorio. Déjame poner todo aquí y déjame llamar a la configuración aquí. Déjame simplemente devolver este multi post porque necesito esto de esta función, voy a renderizar y luego voy a convertir kips Para la segunda prueba, voy a escribir una prueba como navega a la página de identificación después hacer clic en los ítems Lo que voy a probar, realidad voy a probar que cuando usuario haga clic en un botón y cuando el usuario navega, entonces verá esta página Para eso, voy a volver a usar la configuración, voy a conseguir el post marcado. Ahora, obtendré un objeto de usuario de la biblioteca de eventos de usuario, de la biblioteca de pruebas de reacción. Voy a llamar al método de configuración. Voy a darnos un usuario que puedo hacer algo como click. Algo que haga clic. Esto en realidad simula una interacción de un usuario con un elemento hasta la página lo que voy a hacer clic, voy a, por ejemplo, dar clic en el primer enlace que está relacionado con la entrada del blog. Asegurémonos de que primero tengamos todos los enlaces. Definamos una variable. Yo diría que todos los enlaces de publicación que serán y estoy obteniendo todos los enlaces dentro de la página después de renderizar mis componentes. Y estoy esperando primero que la longitud sea la longitud de publicación Mc porque para cada publicación, tengo un enlace, así que espero que se haga el primer enlace. Entonces voy a dar click en el primer enlace. Primero, asegurémonos de que hasta aquí, todo esté correcto. Vamos a correr esto. Ahora veremos faltante especificador de índice de configuración. Vamos a ver si hice mal la importación. Arreglemos esto. Solo necesitamos importar evento de usuario. Déjame simplemente quitar esto y luego volvamos a importarlo. No necesito el índice pero solo necesito ramificar esto a partir de eventos de usuario. Realicemos de nuevo la prueba. Bueno. Ahora está pasando y asegurémonos de que en realidad esta camarilla funcione Para probarlo, en realidad, necesito crear los enlaces correctamente. Para el primero porque no necesitábamos la prueba, no necesitábamos los enlaces. Acabo de agregar un router de memoria y solo lo aleteo porque lo único que queríamos verificar era asegurarnos de que el enlace sea correcto Pero ahora que en realidad tenemos la interacción entre los enlaces, veamos cómo también funciona nuestra app. Estamos usando router de memoria y este es un router de navegador y siempre que estemos en la barra, vamos a tener la página de bloqueo y luego cada vez que vamos a barra diagonal post ID, vamos a ver esta También voy a necesitar traer estas rutas dentro de mi prueba. Yo diría que quiero tener estas dos rutas y también quiero envolverla dentro del elemento ruta. Y también necesitamos importar rutas de react router Dom y también voy a quitar esta página de sangre y luego voy a poner esto a aquí. Ahora, en realidad, tengo un router que tiene una barra diagonal que muestra la página de renderizado y post mostrar esta página Dentro de nuestro router de memoria, en realidad puedo decir interés inicial, que significa lo que soy actualmente, lo que el usuario está ahí podemos decir que ya estamos slash para renderizar la página de bloque Ahora que en realidad el usuario haga clic en esta cosa, significa que empezamos desde la página de bloqueo. El router de memoria renderizará estos componentes. Ahora, está esperando que la página de detalles de la publicación se renderize después de hacer clic. Este es el contenido que quiero probar. Por ahora, debido a que esta página otra vez, usa una consulta, que es una consulta diferente que marcamos, voy a simplemente probar que en realidad estamos viendo la carga. Voy a agregar esperar aquí y cuando esto sucedió cuando estemos dando click en el post, vamos desde la página del blog, vamos a desarrollar la página de detalles y primero, veremos una carga, pero luego esto se resolverá a una respuesta y luego veremos todo el asunto. Pero por ahora, solo voy a agregar esto porque estoy esperando que esté dentro de los documentos. Hagamos la prueba. Ahora la prueba está ayunando porque el click el click es Acnc acción, así que también voy a añadir un aquí y también voy a hacer esta función acing Démosle tiempo hasta que el enlace y el click y todo funcione para asegurarnos de que esto esté funcionando. Perfecto. Ahora, la prueba está pasando y ahora estoy seguro de que en realidad esta navegación, este click en esta página está funcionando. Si quieres asegurarte 100% porque esta carga también existe dentro de la página de bloque. También tenemos aquí una carga. Ahora, te puedo mostrar algo, por ejemplo, cambiar esto para cargar detalles de publicación. Y luego dentro de mi prueba, puedo decir que en realidad necesito ver esto para estar seguro de que en realidad estoy probando lo correcto porque tal vez esto viene de la cosa o otra manera que será mejor sería en realidad decir eso antes de hacer clic, estoy esperando no ver la prueba de carga. Si cambio esto con consulta alba text, estoy esperando que sea tener longitud cero. Y significa que aquí estoy seguro que el valor simulado para el post de uso ha funcionado. Estoy viendo la página del bloque, todo el bloque se ha cargado, así que no hay página de carga. Pero cuando el usuario haga clic en él, entonces veré la prueba de carga. Ejecutemos esta prueba, y esto también es pasivo. La forma correcta en realidad sería tener también un valor de marca para este, este libro y asegurarse de que, por ejemplo, la diferencia entre esta página es así, mostraremos aquí el nombre del escritor. Si quiero probar eso realmente después de hacer clic, estamos en la página correcta, debo buscar al escritor de este autor de este post. Hagamos eso. Vayamos también y dejémonos exactamente como lo que tenemos. Marquemos aquí la publicación de uso. Solo uso post que trae toda la lista. Vamos a marchar ahora el sencillo. Para hacer eso, solo estoy copiando esta línea, también voy a mapear esta el post. También voy a copiar toda esta marca. Voy a decir que en realidad para esta época, vamos a devolver siempre el primer post. El parámetro no es importante aquí voy que ahora no quiero ver la carga, pero quiero ver en realidad al autor del primer post. Esta es la primera y ahora espero que eso vea esto. Así que vamos a ejecutar esta prueba y ahora veremos que los posts que map no es una función. Tengo un error tipográfico aquí, debería obtener uso post y también debería importar uso post También realmente siempre me encanta mostrar estos errores a mis alumnos porque esto no es así que estoy escribiendo código y funciona por primera vez. Siempre sucede que no vemos algo. Ahora tengo una prueba real realista que estoy probando, que he creado un router de memoria, he creado estas páginas, las he vinculado y estoy empezando con slash y ahora estoy involucrando en la interacción del usuario Y cuando hago clic en eso, me estoy asegurando de que la página haya sido cambiada y porque sé en esta nueva página que este elemento existe. Esta es también una de las mejores prácticas para no verificar la URL. Puedo comprobar que, por ejemplo, la URN debería ser un slash Postm, pero esto es algo interno y en las pruebas de integración, nos interesa en realidad lo que está sucediendo Entonces, ¿qué sucede cuando el usuario hace clic, debería ver el nombre de la persona y debería, por ejemplo, ver también la descripción de la prueba y también se puede agregar una condición, y yo diría que obtiene esa descripción. Pero debido a que la descripción tiene múltiples líneas, también voy a necesitar agregar una condición yo diría, si sólo las primeras diez líneas primero diez caracteres está ahí, está bien. Hagamos la prueba. Probablemente va a fallar porque la descripción tiene muchas entradas. Bien, no perfecto. No, ha estado funcionando. Y ahora estoy seguro que realidad esto funciona porque si vengo antes de hacer clic en esta página y digo consultar todo por texto, estoy esperando no ver el no ver la descripción porque cuando estoy en la página del Blog, solo veo el título, la foto. Si agrego esto, entonces estoy seguro de que en realidad si esta prueba pasa eso estoy probando el escenario correcto. También puedes eliminar esta carga. Primero, estamos en la página del Blog, no tenemos ninguna descripción. Ahora, el usuario hace clic en él. Estoy esperando ver el nombre del autor y esta vez también espero ver descripción. Y enhorabuena. Esta fue una prueba realmente complicada. Tuvimos que hacer muchas cosas, tenemos que trabajar con router de memoria, tuvimos que marcar algunas de las consultas que teníamos pero lo hicimos y esta es una prueba muy buena que la podemos usar dentro de nuestro proyecto. 42. Introducción a la prueba de escritura para la sección de administración: Ya agregamos pruebas para las páginas del blog y todas las páginas del blog tienen pruebas y también ejecutamos las pruebas con la cobertura, veremos que todas ellas están completamente cubiertas, lo cual es maravilloso. En esta sección, quiero ir y quiero comenzar a probar la sección admin. Para el lado del bloque, queríamos ver que la página del blog está funcionando, así veremos el post y cuando el usuario haga clic en eso cambia la navegación y también podremos ver la descripción del post. Y ahora quiero escribir prueba para la sección admin. Si vamos al administrador y a casa, aquí tenemos un número del post como tarjeta. Dentro del post, puedes ver la lista del post. Aquí el usuario admin tiene la opción de agregar un post. Puedo escribir algo y puedo en el post o puedo venir aquí y puedo presionar Editar y puedo cambiar la descripción y el contenido de este post. Estos escenarios están más involucrados con la interacción del usuario. En realidad, si quieres probar esto, primero usuario Admin debería visitar esta página, entonces debería venir y hacer clic en esta y luego debería cambiar algo en el título, cambiar algo en la descripción y luego probablemente cambiar una foto, enviar el post, y luego podemos asegurarnos que en realidad algo está funcionando correctamente. Estas pruebas son un poco más complicadas que las pruebas que tuvimos en la sección anterior. Pero lo interesante será que usaremos más biblioteca de pruebas de reacción y vamos a usar más funciones y más métodos de la biblioteca de pruebas de reacción. Y así en el siguiente video, voy a mostrarte un poco sobre los métodos y funciones que reaccionan probando biblioteca para interacciones de usuario proporcionan, y luego vamos a agregar pruebas para nuestra sección de administración. 43. Diferentes métodos y acciones de eventos de usuario: Entonces hablemos de eventos de usuarios. El evento de usuario es un componente de la biblioteca de pruebas de la biblioteca de pruebas de reacción que podemos importarlo así, importar evento de usuario en la biblioteca de pruebas, evento de usuario de barra diagonal El propósito de este componente es proporcionar interacción del usuario. Por ejemplo, podemos tener diferentes acciones. El primero, puedo ir y puedo escribir dentro de un elemento de entrada, hola. Y con estos ayudantes, en realidad podemos probar las interacciones del usuario con nuestros cuatro elementos En el segundo ejemplo, puedo aclarar lo que ya escribí en el elemento test. Y con click y DBL click, es doble click. Puedo hacer clic en un botón o puedo hacer doble clic en un elemento de celda. Imagina que tienes una tabla, y la tabla si usas un doble clic va a la edición más, que puedas cambiar el contenido de sí misma. Y para probar que tenemos DBL click, que es doble click Podemos probar el desplazamiento del mouse sobre un elemento para ver si está sucediendo una punta de herramienta Si tenemos una selección que tiene opción múltiple, podemos usar la opción method select para seleccionar un valor de esta opción. Si tienes una casilla de verificación para que se marque, también podemos volver a llamar, dar click con los elementos checkbox y para la subida, podemos llamar a eventos de usuario upload y luego pasaremos el archivo que queramos subir y también las entradas que se le asignen con esta acción Estas son las diferentes acciones y me parece realmente interesante que con la ayuda de la biblioteca react testing, podamos probar todo este tipo de acciones y podamos ver qué pasará en nuestra app cuando simulemos las acciones que los usuarios están tomando al trabajar con nuestra aplicación. 44. Prueba de escritura para la mesa de administración (parte 1): Así que comencemos por ir a nuestra carpeta de administración. Dentro de nuestra carpeta de administración, tenemos dos carpetas, páginas de componentes, y primero voy a escribir prueba para la carpeta de componentes. Y verás que tenemos una barra lateral y la barra lateral es un elemento de menú que este es el menú que está mostrando en el lado izquierdo de nuestra página. Y tenemos un post que aquí tenemos crear o editar post. Este es el componente que cuando creamos un post o editamos un post muestra este formulario y tenemos el post list, que es este componente de tabla que renderiza lista del post, y tenemos el botón delete que cuando el usuario presiona sobre él, puedo muestra un primero, muestra una confirmación y si el usuario presiona yes, entonces borra el post Entonces comencemos a escribir test con el primero para el post de la lista, y veamos el componente, qué hace el componente. Utiliza, de nuevo, estamos usando aquí reac query para buscar los posts, y si está en la carga, vuelve, y luego si hay un error, vuelve, y luego vamos a tener unas columnas, que es una matriz de objetos Y esta es en realidad la tabla que se renderizará y cada columna es la primera columna es un número, así que solo estamos renderizando un índice en ella. La primera columna la segunda columna es la imagen característica, y estamos leyendo del post la propiedad de la imagen y URL, y el renderizado será una imagen con el texto alternativo del título del post y la URL de la imagen, y luego esta es la segunda columna. La tercera columna será el título. Lo cual apenas estamos leyendo el título del post, y la primera columna serán las acciones. Y dentro de las acciones, tenemos primero un enlace a una edición que va a este enlace admin post edit, y tenemos un botón dite que estamos renderizando y estamos pasando el post ID a eso Y en realidad, estamos renderizando una tabla con estas columnas que te mostré, y nuestra fuente de datos serán en realidad los objetos que se renderizarán dentro de esta tabla, que son los posts de los que los hemos leído readquire así que comencemos a escribir test Voy a crear un archivo. Voy a recoger Listar publicaciones. La prueba prueba y voy a añadir un bloque describir y será para el componente post lista y dentro de eso voy a añadir un bloque. Como primera prueba, solo quiero asegurarme que si la página se está cargando, vamos a mostrar esta carga. Yo solo estoy escribiendo randoms cargando si no se han cargado los posts Sin embargo. Voy a pasar una función aquí y mi expectativa será en realidad, vamos a importar también. Vamos a renderizar el componente de lista y vamos a importar post, vamos a importar render, vamos a importar también Pantalla biblioteca de pruebas de reacción y nuestra condición sería la pantalla que obtiene por carga de texto para ser inexacta Estoy seguro de que sabes que la primera vez que esta prueba no va a pasar porque en realidad necesitamos marcar publicaciones de uso. Ya lo hicimos, así que voy a las páginas, voy a sitio y voy a páginas y voy a la página del blog. Lo hicimos así. Usar poste. Voy a copiar esto que teníamos anteriormente. Lo puedo poner antes aquí. También tenemos que marcar primero todo el módulo. También necesito traer esta línea para esta, quiero que un dato no sea nada para ser un NTR y quiero aquí para facilitar la carga para que sea verdad Quiero asegurarme de que este componente muestre la carga. Vamos a hacer estas pruebas. Y un punto que quiero mencionar aquí es que es lo más importante de las pruebas. Ya ves lo fácil que agregué la prueba porque anteriormente tenía la misma solución, y solo uso la misma solución aquí. Y mucho desarrollador al principio, cuando empiezan a aprender sobre las pruebas, piensan que es complicado. Requiere tiempo. Al principio, sí, pero cuando configuras tu proyecto y estás configurando cuando estás escribiendo los primeros casos de prueba, después de algunas veces siempre puedes usar los ayudantes, usar las marcas, usar la especia que hayas creado previamente, y hará que sea mucho más fácil para el futuro escribir pruebas Entonces ahora verán que acabo copiar algo de mi prueba anterior, y ahora tengo mi primer escenario, que es asegurarme que en realidad esta prueba sea leal. Y ahora vayamos y cambiemos y agreguemos otra prueba que en realidad estamos esperando renderiza una tabla con una lista de posts. Y ahora, voy a probar que en realidad si cambio esta marca a vuelve a cargar sería falsa y devuelve una lista de publicaciones marcadas, estoy esperando ver una tabla. Y esta tabla debería tener un índice. Esta tabla debería tener y todas las columnas que hemos visto. Y para este post marcado, nuevamente, voy a usar lo que he creado anteriormente. Sólo voy a copiar esta línea. Ya tenemos al farsante. Estamos generando un número con un faker y para cada uno de ellos, vamos a utilizar la función helper, la fábrica de pruebas que hemos creado para esta prueba Voy a renderizar esta vez, voy a esperar no ver nada. Voy a consultar todo por texto y estoy esperando que esto tenga longitud de cero. Espero que esto no se muestre. Hagamos esta prueba. Ya vimos este error anteriormente. Esto está sucediendo porque si voy al post de la lista aquí, también tenemos un elemento link. Para solucionar este problema, debería envolver mi componente dentro de la ruta de memoria. Voy a envolverlo en una ruta de memoria y voy a arreglarlo con más guapa Volvamos a leer sobre la prueba. Y ahora vamos a obtener otro error que también vimos anteriormente, no hemos proporcionado consulta proveedor cliente, vamos y también vamos a traer esto de nuestra otra prueba y vamos a envolverlo. También necesitamos la línea de consulta, vamos a traer también esta línea de la otra prueba. Lo pondré dentro de mi bloque declarado para que todas las pruebas puedan usarlo . Eliminen estos. Volvamos a ejecutar la prueba. No y este error en realidad no está relacionado con nuestra prueba. Esto viene de nuestro componente que reacciona espera que cuando tengamos una lista, que es como, por ejemplo, una tabla, cada fila debe tener un ID único. Y el diseño nos proporciona una clave de fila de propiedad que podemos decir, cada pose tiene un ID y por favor use ese ID como clave para esto. Y porque sabemos que las identificaciones son únicas, ésta será única. Así que agreguemos eso y volvamos a ejecutar la prueba. Y ahora veremos que la advertencia anterior se ha ido, y ahora tenemos un nuevo error, ventana no implementada que computa estilo Y esta es la misma situación con el JSTOM y navegador que dentro de JSTOM no tenemos todas las funciones, así que carta para resolver eso nos deja ir a nuestro conjunto de archivos de configuración Y así lo hicimos anteriormente con los medios de partido, también voy a agregar una nueva marca aquí. Entonces voy a simplemente escribir esto como una ventana que consiga estilo computes, y y solo voy a marcar esto con algo que siempre devuelve y una cadena Eso fue venir y regresar y ejecutar la prueba. Ahora la prueba está pasando y no tenemos ninguna advertencia y error, así que está limpia. 45. Prueba de escritura para la mesa de administración (parte 2): Pero en realidad, para que la prueba sea realista, necesito asegurarme de que la tabla se renderizará y veré todas estas filas y todas estas columnas. Entonces para hacer eso, voy a definir una variable para filas, y yo diría pantalla que obtiene toda la fila de rollo. Y estoy usando Ant Design para la biblioteca de UI y ntsign una fila fila para cada fila Entonces aquí tenemos una fila de encabezado y tres es para el post. Entonces estoy esperando a C, el número de las filas debe ser el número de los postes marcados que es de longitud y uno también para cabeza. Si tengo tres filas, entonces debería ver una mesa con una fila con cuatro filas. Hagamos su prueba. Y ahora está pasando. Pero volvamos a ejecutar la prueba y volvamos a ejecutar la prueba y ahora verás que la prueba está fallada. Quería mostrarles porque este también es un tema realmente interesante en las pruebas y ahora veremos el beneficio de tener el farsante y beneficio de generar números aleatorios Si aquí tuviera una matriz de longitud fija de tres elementos, esta prueba siempre se pasaría. Y no pude ver este caso. Por qué está ocurriendo este caso. Veamos corrí la prueba por las dos primeras veces que estaba pasando por tercera vez, está fallando. Dice que estamos esperando 21, pero el real es 11. Lo que está pasando aquí es nsdsign. Esta tabla de ntsign por defecto proporciona una paginación con el tamaño de diez Oh, yo tengo más de diez posts, va a mostrar una inación de página. Podemos probarlo estableciendo una paginación para que sea un objeto para ser un objeto Creo que debería pasar el tamaño de página de uno. Imaginemos que si tengo el tamaño de página de dos o dos, verás que ahora, me muestra una paginación, para el si cambio este tamaño de página a una, ahora voy a ver tres páginas Por defecto, estas opciones existen y es para las diez filas. Cuando está sucediendo cuando el número de las s marcadas son más de diez, y el diseño solo muestra la primera fila de diez y tenemos una fila de encabezado por lo que debería ser 11. Para que esta prueba funcione, tengo que probar esto que si marcado longitud mayor a diez, entonces estoy esperando obtener un 11 para ver un 11. De lo contrario, estoy esperando ver la longitud. Entonces si el número del cartel tengo más de diez, estoy seguro que la inación de la página va a pasar, así que estoy esperando ver 11 registros. Pero si es menor que, en realidad debería ser el número del puesto más uno. Ahora volvamos a ejecutar la prueba. Ahora está pasando. Volvamos a ejecutarlo y volvamos a ejecutarlo, y ahora veremos que siempre lo es. Con el fin de asegurarme puedo cambiar también este número a 12 para asegurarme de que en realidad mi prueba está cubriendo con la paginación O podemos cambiarlo a la. Es aún mejor si separo esta prueba a dos categorías. Déjame copiar toda la prueba. Primero creemos también un archivo de configuración porque no quiero copiar y pegar todo. Vamos a crear una configuración y esta configuración será una función que voy a poner todo esto dentro de la configuración y voy a devolver Mark post como lo hicimos anteriormente aquí voy a llamar a setup voy a decir eso y voy a definir también los posts marcados aquí para el primer caso de prueba, estoy esperando que los muestre. Voy a copiar toda la prueba y también me aseguraré de que lo llamaré renders una tabla B Hagenation si el número de los puestos son más Y para este caso de prueba, estoy esperando obtener siempre 11 si sé que el número de los puestos son más de 11. Y para simular esto, voy a pasar un parámetro a setup, que será número de posts, que será un número. Y aquí voy a dejarnos llamarlo min y max. Quiero también min max numero de publicaciones. Vamos a llamarlo número de publicaciones. En vez de siempre uno y 20, voy a pasar aquí estos parámetros. Para el primer caso de prueba, siempre voy a pasar una prueba y también puedo hacer que sea el valor predeterminado para uno y en 20. Para el primer caso de prueba, quiero asegurarme de que es menos de diez, así que iré con uno y nueve. Quiero obtener un número de los puestos 1-9 y tengo esperando ver Para el segundo caso de prueba, voy a arreglar algo 11-12 Para este, quiero asegurarme de que la prueba es en realidad la tabla muestra una pagenh Asombroso. Ahora, tengo dos pruebas específicamente. Por dos condición que está ocurriendo. Con esto, también puedo asegurarme de que mi tabla muestre la paginación y cómo podemos asegurarnos de que está funcionando Yo solo vengo aquí y cambio la paginación. Por ejemplo, a false, eso significa que la tabla de páginas no muestra aquí la paginación, entonces esta prueba debería fallar Y verás que esto está fallando porque en realidad renderiza todas las filas y no sólo la primera. Ahora estoy seguro de que estoy renderizando una mesa, y esta mesa tiene suficiente el número correcto de los rollos. Pero también quiero demostrar que estoy renderizando la tabla correcta. ¿Y qué tiene esta mesa? Esto tiene un encabezado, así que quiero asegurarme de que voy a obtener todos estos encabezados correctamente. Quiero que mi primera condición sea obtener por texto, y voy a usar una etiqueta hash para estar en el documento. Hagamos esta prueba. Y está pasando, así que voy a probar y voy a agregar un comentario aquí probando los encabezados de tabla. Y la segunda será una imagen destacada o estás esperando ver este texto dentro de mi mesa, también espero ver un título y una acción. Ahora, estoy seguro de que en realidad la tabla también tiene los encabezados correctos. Tengamos también eso a prueba. Por ejemplo, el primer post se mostrará correctamente. Vamos a copiar esta línea y vamos a probar el contenido de la tabla. Para el primero, por ejemplo, voy a conseguir el primer post. Y espero que el título de este texto esté dentro del documento. También quiero ver el botón de editar y eliminar. Por ahora, eliminemos esto porque siempre tengo múltiples botones, vamos a conseguirlos por todos por rol. El primero es en realidad un enlace, así que puedo usar la fila de enlaces. Consigamos todos por varilla y obtengamos todos por rollo y luego obtengamos el primer enlace y ¿qué queremos verificar? Queremos comprobar que en realidad el enlace tiene un valor correcto. Tienes atributos Hf debería ser Admin post edit y el post ID, admin post Editar también obtener el ID desde el primer post. Déjame simplemente quitarles a estos dos. Arreglemos esto con más guapa y hagamos la prueba. Y ahora la prueba está fallando, en realidad esperar que el elemento atribuya admin post. Tengo una S aquí extra. También puedo reemplazar esto con las pruebas de plantilla. En lugar de tener un plus, también puedo reemplazarlo para que sea así. Si hago eso, creo que será posible en bien sé que lo es. Vamos a devolverlo a lo que era anteriormente. Pero tuve un error tipográfico y ahora estoy esperando que esta vez pase así que ahora veo, estoy seguro que el título está aquí, el edit está aquí y también para el delete, tenemos un botDe éste, también puedo asegurarme de que los botones existan, así también puedo conseguir esperar pantalla que se ponga todo roll y aquí voy a decir botón, estoy esperando exactamente como el número de las publicaciones para el botón. Si tengo tres puestos, también quiero ver que mi tabla renderiza tres y tres. Ahora tenemos dos un error porque creo que la paginación también está aquí Dejemos más claro que para hacer la prueba más específica para el botón, puedo pasar un segundo parámetro cuando estoy usando get role y puedo decir que quiero obtener solo los botones que el nombre del botón es eliminar. Porque si miramos el componente, si vemos que tengo, esto es una confirmación y dos opciones son sí y no, y el texto es eliminar. Yo les digo, por favor dame solo los botones que son el nombre se borra así que no quiero que me confundan con estos botones. Leamos en la prueba. Y ahora está pasando. Leamos en él varias veces para ser probados con diferentes conjuntos de datos, así que en realidad estamos seguros que nuestra prueba es correcta y estamos probando la corrección. Maravilloso. Ahora tengo la prueba para la mesa. Tengo la prueba para la paginación, y en el siguiente video, voy a interactuar realmente con el botón Editar En realidad quiero hacer clic en este botón Editar y quiero hacer clic en este botón Eit y quiero agregar escenarios para estos dos casos 46. Prueba: editar el elemento de acción: Ahora que hemos agregado pruebas para el renderizado en esta tabla, y nos estamos asegurando de que se renderice el título, el número de las filas sea correcto y la tabla se renderice correctamente. Quiero agregar un botón de prueba para editar y eliminar Acciones. Y en este video, voy a agregar una prueba para editar. Y lo que voy a probar, quiero asegurarme de que cuando el usuario haga clic en esta edición, entonces los usuarios verán esta página y esta página tenga una entrada, tenga un área de texto, tenga un botón de subir y enviar botón. Pero la interacción de los usuarios para esta página, no es importante para mí para esta página. Solo quiero asegurarme que cuando estoy presionando el botón Editar, este irá a la página correcta y el usuario será redirigido a la página correcta para hacerlo, llamaré y crearé un nuevo bloque de describir y diría que llamaré y crearé un nuevo bloque de describir y muestra la página de editar publicación cuando el usuario haga clic en la acción Edits Edit Voy a pasarle una función y eliminemos esto. Al igual que anterior, voy a configurar mi post y voy a limitar el número al 1-5. Diré contras puestos marcados iguales a este post. Lo que estoy esperando, estoy esperando ver los enlaces, así que voy a la primera condición sería en realidad que este enlace tenga un atributo correcto, debería ser un administrador de barra diagonal, si ves en la esquina inferior izquierda de la página, el enlace debe ser admin, barra diagonal, editar uno Consigamos enlaces y yo los conseguiría por una pantalla que se pone todo por rollo. Para el primer enlace, voy a esperar que los enlaces cero tengan atributos Hf links. El href debe ser admins ID, post Edit. Permítanme reemplazar esto con la cadena de plantillas y permítanme agregar también exactamente una publicación marcada. Estoy esperando obtener la identificación del primer post estará dentro de la f de este enlace. Ejecutemos esta prueba y está pasando. Después de eso, quiero dar click en este enlace y podemos hacerlo con la ayuda del evento de usuario de la biblioteca de pruebas React. Voy a definir un usuario y llamaría a eventos de usuario que configuro y voy a dar click en el primer enlace. Porque agregué evitar, ahora también debería cambiar esta función para que sea asincrónica Y después de esta edición, voy a esperar y voy a ver el post de edición. Voy a agregar la condición, pero sé que la prueba fallará. Hagámoslo juntos y les diré por qué esto es fallar. Vayamos aquí. Demos clic en la edición. Yo voy y les estoy diciendo que espero que esto se vea dentro de esta página, y voy a esperar que este texto esté dentro del documento. Y hagamos la prueba. Como dije, va a fallar. Ya nos enfrentamos a este problema antes. Quiero que detengas el video, lo pienses y adivine lo que está pasando mal aquí. Todo bien. Si recuerdas, tuvimos el mismo problema dentro de la página del blog, y la razón es que porque si vuelvo a nuestra configuración, aquí, acabo de agregar un router de memoria y acabo de renderizar la lista post componentes. ¿Y por qué hice eso? Porque dentro de nuestro componente de publicación de lista, teníamos un enlace, y en react, cada enlace debería estar envuelto dentro de un enrutador y acabo de agregar esto. Pero no definí las rutas. Yo no definí los enlaces. No definí la navegación entre ellos. ¿Dónde se ha definido esto? Si vamos a nuestro post nivel 65, aquí se han definido las rutas. También necesito definirlos para la prueba. No los necesito a todos. Solo necesito por ejemplo, aquí pensé cuando estamos en el post de barra diagonal admin, por favor cargue la página del post Cuando estemos en la página de edición, cargue la página Editar. Entonces voy a traer esto y voy a tener un bloque de rutas aquí, bloque de rutas, y voy a traer esto y también necesito el espacio de post. Solo necesito estas dos rutas. Y también agregaré un prefijo admin. Yo diría que si estás en las publicaciones de administración porque esta página es barra diagonal admin publicaciones de barra diagonal Por favor, cargue la página de publicación. Si estás en la publicación de administración eliminar, por favor renderizar la página de edición de publicaciones. ¿Por dónde empezamos? Estamos a partir de esta página. También voy a pasar este parámetro como entrada inicial. Entonces ahora, en realidad tengo un router de memoria. Tengo un router que tiene dos rutas y estamos empezando por aquí. Ahora entonces presiono la edición, hay un elemento y hay un índice para esta ruta. Bajemos y volvamos a ejecutar la prueba. Y las pruebas siguen fallando, veamos qué está pasando. Verás eso por dentro, no, no tengo cargando componente y ¿qué está pasando? En realidad, la navegación se ha hecho, pero como fuimos al post de edición, vayamos y veamos esta página. Cuando vayamos a esta ruta, esta página se cargará y esta página, tenemos esta línea. Entonces porque intenta recuperar la publicación del servidor y luego pasa primero al estado de carga Entonces seguimos viendo el post de edición, no estamos viendo este título. Así que vayamos y marquemos esta publicación de uso dentro de nuestra prueba. Y para marcar post, ya hicimos esto también anteriormente. Voy a simplemente quitar solo voy a copiar la prueba que teníamos de la página de bloque. Lo hicimos así. Voy a copiar todo el bloque. Y dentro de mi página de administración, también voy a agregar esto y estamos diciendo que en realidad el primer post debería estar regresando siempre en la perura usar posts, devolver todos los posts en forma corta, devolver el cero También necesito primero marcar también todo el módulo eso es así con esto, estoy marcando este módulo y aquí estoy definiendo que si se ha llamado a esta marca, se debe devolver este objeto fijo. Volvamos y hagamos la prueba. Y maravilloso. Ahora la prueba está pasando. Siempre me gusta tener una advertencia limpia y sección de flecha. Arreglemos también el error que estamos viendo aquí. Verán que aquí tengo una advertencia. Se ha superado la prueba, por lo que el usuario ve esta página, pero también tenemos una advertencia. Qué sucede cuando el usuario presiona sobre esto y hace clic. En esta área, he usado CK Editor, y el error que estamos viendo está relacionado con eso. Y en esta prueba, realidad no me interesa CK Editor. No me interesa interactuar con eso. Y esta es, de nuevo, una de la utilidad de las características de burlarse que puedo ignorar por completo a CK Editor y puedo burlarme de ello Y hagamos esto para no ver una consola sucia como esta. Vayamos y veamos nuestro franqueo de edición y veamos dentro de nuestra página de edición de publicaciones Tenemos el encabezado, tenemos un componente y este componente tiene un CCA Eeditor que probablemente esté aquí, exactamente Veamos dónde se ha importado esto. Esto ha sido importado de Editor cinco y Editor cinco. Voy a marcar todo el módulo. Vayamos y vamos a duplicar esta línea y esta vez voy a que quiero burlarme de Ckditor y volvamos atrás y dejemos leer en la prueba y maravilloso Ahora la prueba está funcionando y además no veo ninguna advertencia y ningún mensaje 47. Prueba del botón de eliminar (caso 1): Tan maravilloso. Tenemos un muy buen progreso, y estoy muy contenta de que estés conmigo aquí. Estamos probando cada pieza de nuestro software y lo estamos convirtiendo en un software de muy alta calidad con este esfuerzo. Ahora mismo, probamos en la mesa, probamos el edit fcton Y en este video, quiero probar el botón de borrar. Y ¿qué pasará cuando los usuarios presionen el botón de borrar? Primero, verán un pop up y luego podrán decidir ver sí o no. Si dicen que no, entonces el puesto se queda. Pero si dicen que sí, entonces esta prueba, esta publicación será eliminada. Si lo hiciste por error y quieres devolver el post, solo necesitas reiniciar el servidor. Entonces, si solo detienes el servidor del nodo J y lo reinicias, y si actualizas la página, volverás a recibir el mismo post. Así que vayamos y escribamos la prueba para este escenario. Voy a crear dos pruebas porque primero, quiero asegurarme de que voy a ver esta casilla de confirmación y después empezaré a escribir pruebas para el escenario. Vamos a agregar un bloque aquí, yo diría que muestra un cuadro de confirmación, dejar que los usuarios hagan clic en los usuarios haga clic en eliminar elemento de acción Y nuevamente, porque necesito al usuario, puedo escoger la mayoría de las líneas de esta prueba y de 1 a 5 publicaciones serán suficientes. Esta vez, me interesan los botones. Voy a conseguir todos los botones y porque solo me interesa el botón de borrar, voy solo me interesa el botón de borrar, a agregar una segunda condición aquí. Diré que solo quiero ver el botón de borrar. Voy después de eso, voy a dar click sobre este botón en el primer botón que estoy viendo, y luego estoy esperando ver este texto. Añadamos una condición para esperar una pantalla que obtiene por texto para estar en el documento. Si esto está sucediendo, entonces mi prueba debería pasar. Maravilloso. Para asegurarme también puedo agregar otra condición, puedo agregar también esta línea antes y puedo decir consulta todo por texto. Primero quiero verificar que en realidad este tenga longitud de cero. Quiero asegurarme de que esto no existe dentro del documento. Cuando presiono este botón de clic, entonces esto está sucediendo. Déjame también bajar esto un poco y tampoco necesito el valor de retorno para la función de configuración. Primero, estoy comprobando que no debería ver este texto, luego si presiono uno de los botones de borrar, entonces este texto debería mostrarse. Y maravilloso la prueba es pasiva. 48. Prueba del botón de eliminar (caso 2): Ahora vamos y probemos el segundo escenario, que será que si presiono el botón sí, y ¿qué pasará si presiono el botón sí? Leamos juntos el código fuente. Tenemos un post de lista y el interior tenemos dos botones de acción. Este es el enlace, este es el botón. ¿Qué es este botón de código de botón de eliminación? Esta es primero esta conformación y luego tiene dos textos, sí o no Y cuando estemos confirmando, en realidad se cortará el post de eliminación. Y ¿qué es esta eliminación? Esta eliminación es una mutación de la consulta rea, que llamará a una llamada API y luego en realidad borra la publicación del servidor Pero para esta prueba, no nos interesa la interacción con el servidor. Somos lo único que condiciona que quiero probar para asegurarme de que esta función ha sido cortada. Entonces, si el usuario hace clic en el sí, quiero asegurarme de que esta función ha sido llamada y esta función ha sido llamada con el parámetro correcto, que es la prueba le. Escribamos esa prueba. Voy a copiar todo este bloque y voy a llamar voy a cambiar esto. Diré eliminar el post o dejemos que seamos más llamadas eliminar post. Si el usuario confirma la eliminación. ¿Qué esperamos? Nuevamente, estoy creando pi pos. Este ya lo probé así que no lo necesito. Voy a recibir el botón de borrar, voy a hacer clic en él, y estoy esperando ver este texto. Esta vez, voy a conseguir el botón de sí. En lugar de esta condición, voy a definir un botón de sí y voy a decir que una pantalla consigue todo por rollo. Y con el botón y esta vez estoy apuntando al botón de sí y voy a obtener el primer botón. Voy a hacer click en esto pero esta vez voy en vez de cambiaré esto. Aquí debería ir mi expectativa y mi expectativa sería que en realidad esa función, esta borrar posts para ser cortados. Pero esta entrada de borrar primero para asegurarnos de que se está llamando, primero debemos marcarla. Esto viene de este módulo y para poder comprobarlo, también necesito marcarlo. Vamos a la parte superior de la página. Duplicemos esta línea y reemplacemos las entradas de API de pases, use delete posts. Vamos a subir publicación de API, usar delete post. ¿Qué hace? Devuelve un objeto que es el mutado es delete post y tiene una E pendiente Ya hicimos esto, así que sólo voy a copiar esto y voy a traer esto dentro. Puedo ponerlo también dentro de la sección de configuración, lo pondré todo junto aquí. Voy a usar dilTPST y diría un mutado. La clave será mutada. Y pendiente, pasaré la E pendiente de niebres. Para este, voy a definir aguja llamarlo eliminar post. También voy a eliminar aquí la entrada de eliminación. Yo diría que const post es igual a t fn. Como recuerdas, dot fn es una función espía. No hace nada, pero solo puedo asegurarme de que esta función haya sido cortada. Si bajara, mi expectativa sería que esta función hubiera sido llamada una vez para haber sido llamada por una vez. Estoy diciendo que cada vez que esto sucede, este botón sí hizo clic, estoy esperando que se corte esta función de eliminación Hagamos esta prueba. Y está pasando y para asegurarme de que en realidad estoy probando la corrección, puedo traer esto también aquí y puedo decir que esta función no debería haber sido llamada. Y cada vez que estamos recibiendo este botón de sí y cuando estamos dando clic en este botón de sí, estamos esperando que nos llamen. Y ahora estoy seguro de que en realidad la acción de este botón ha provocado que se corte este botón. También agregaré otra condición. Estoy diciendo que estoy esperando hayan llamado y con qué parámetro, me hayan llamado y con qué parámetro, si reviso el código, estamos pasando el ID del post porque aquí también estoy obteniendo el primer post con estos enlaces y con estos botones, estamos esperando que esto se llame con el post marcado y también necesitamos el post marcado. Primero consigamos las publicaciones de marca aquí. Y tengo un tipo de poste marcado. Estoy esperando que esto haya sido llamado con la identificación del primer post marcado. Maravilloso. Ahora también tenemos una prueba para el escenario delete. 49. Cómo obtener un informe de cobertura para el componente ListPosts del administrador: Como último paso, vamos a ejecutar todo el bloque describe y vamos a ver toda la cobertura del código de cobertura del código. Tenemos un error aquí, lo siento, me olvidé de eliminar las listas de publicaciones aquí. Y ahora dos de todas las pruebas estaban fallando así que ejecutamos las pruebas y ahora todas ellas deberían pasar. Permítanme ejecutar las pruebas con cobertura y veamos el reporte de cobertura de código para este componente. Así que vayamos aquí y refresquemos la página y vayamos a estuvimos en las publicaciones de barra diagonal de administración de SRC Maravilloso ahora veremos que la página de correos ha sido probada con la cobertura del 100% y también hemos cubierto todos estos. Esta es una muy buena prueba también. También podemos ver la cobertura de los componentes reales. Si vamos al post admin components, también se ha cubierto completamente la lista de componentes pus y como efecto secundario, también se ha cubierto el botón delete, pero nuestro propósito no era cubrir esto desde el componente edit, veremos que estas líneas rojas significan que no han sido cubiertas y estas son en realidad relativas a las acciones que está sucediendo, por ejemplo, enviar formulario y subir algo. Pero porque solo tenemos la navegación y por la navegación, renderizamos esta forma y estas líneas han sido cubiertas, pero la acción porque no tuvimos ninguna interacción con esa forma, esas partes no han sido cubiertas, y por supuesto, no era nuestro propósito. Crearemos una prueba separada para ese componente. Pero para el post de la lista ahora tenemos una cobertura realmente buena y todo lo que está pasando por dentro que se ha cubierto, lo cual es realmente bueno. 50. Introducción a la sección de CreatePost: Agregamos test para el componente list posts dentro de la página de administración, y en los videos anteriores ya probamos que podíamos ver el título, podíamos editar e ir a la página de edición y también podríamos eliminar la publicación presionando este botón. Ahora vamos a probar realmente la creación de un post. Y aquí cuando quiero crear un post como usuario, puedo ingresar, por ejemplo, post title, y tengo un editor aquí. Puedo escribir mi contenido dentro de esto y luego puedo seleccionar la foto y luego cuando presione enviar post, entonces este post se mostrará en esta página. Y refresquemos la página y asegurémonos de que ese post esté ahí. En este video, voy a escribir prueba para este componente. Como veis, requiere mucha interacción del usuario la cual vamos a usar la biblioteca react testing para eso primero, necesito ingresar el título dentro de esta entrada primero y luego segundo, necesito ingresar el contenido del post que quiero, y luego debería poder simular un click y luego seleccionar un archivo y luego subirlo con este botón Entonces debería poder enviar todos estos parámetros a la API con esta pose y luego mi prueba debería verificar que en realidad está sucediendo y es trabajo. Empecemos con la codificación e implementemos esta prueba. Será muy divertido. Empecemos juntos. 51. Observar el componente CrearOrEditPost: Como primer paso, veamos este componente, cree o edite post. Entonces esto es un Este es un elemento de reacción, y aquí tenemos una forma. Tenemos una variable de estado para la descripción. Tenemos una variable de estado para el aceite de imagen y tenemos dos mutaciones de RaquerYo para crear post y una para editar Y aquí, manejar la llamada API es responsable hacer el código API. Y este componente, el mismo componente se ha utilizado para agregar un post y también para la edición. Entonces si ves la URL, si vamos a la edición, esta es la misma forma y el mismo elemento. La diferencia es que te mostrará el contenido y el título del post que ya está cargado. Y si vas a agregar nuevo post, entonces veremos el mismo componente, simplemente todo está vacío. La forma en que es manejar es aquí estamos en el admin post create. Pero cuando estamos editando una publicación, estamos en forma de edición de post admin. Tenemos el ID de publicación aquí dentro de la URL. La forma en que funciona, estamos usando la navegación y aquí estamos leyendo en el objeto post. Si el post existe, significa que ya tenemos un post, entonces vamos a editar este post con el ID y también los datos del formulario. De lo contrario, vamos a crear post, y para ello solo necesitamos los datos del formulario. El mango enviar también para ello como un mensaje de validación para asegurarnos de que ya seleccionamos los archivos y luego él usa los datos del formulario, estamos agregando la descripción del título, y luego estamos agregando la imagen y luego estamos llamando al método anterior, que era manejar la tarjeta API y si tenemos éxito, entonces vamos a agregar en barra diagonal post Aquí para el JSX, verás que tenemos un artículo El primero es el título. Si las publicaciones existen, estamos usando un valor inicial. título de la publicación, este feed debería ser requerido y si el usuario no ingresa el título, mostraremos un mensaje. Por favor ingrese el título. Entonces tenemos un contenido. Aquí estamos usando un Ck Editor y tenemos un inalterado que cuando el usuario ingresa algo dentro de este formulario, entonces se llamará. Y luego tenemos un botón de subir, que usuario puede seleccionar un archivo para la imagen, y luego tenemos el botón de asunto. En este video, en el siguiente video, voy a escribir prueba para este componente. 52. Prueba de procesamiento de elementos de forma correcta: Así que comencemos. Lo primero que voy a hacer, voy a crear un nuevo archivo. Voy a llamarlo crea o edito post la prueba que T six Vamos a describir un bloque, vamos a probar, crear o acreditar componente de post, y aquí lo vamos a tener. Entonces yo diría, primero, solo podemos asegurarnos de que el formulario se esté renderizando correctamente. Podemos simplemente decir renderiza una forma vacía. Para ello, voy a renderizar crear o editar la mayoría de los componentes. Yo lo importaré. También necesito importar render desde la biblioteca de pruebas de reacción. Voy a añadir una pantalla. También voy a importar una pantalla. Entonces, ¿qué espero? Espero ver una entrada. Voy a o también puedo asegurarme de que voy a ver solo una entrada. Puedo usar get all by roll y luego puedo decir que estoy esperando ver una fila. Voy a esperar una pantalla y voy a cambiar esto obtener todo por entrada de fila para tener longitud qué. Primero hagamos esta prueba y veamos qué va a pasar. Como puedes ver, encontrar o usar navega tal vez uses dentro de un componente de enrutador Al igual que las pruebas anteriores, también necesitamos envolver nuestro componente de prueba dentro de un enrutador y dentro de un enrutador de memoria. Voy a traer todos estos ya que ya que en realidad no necesitamos navegación por ahora, voy a simplemente envolverlo dentro de un router de memoria. Voy a definir un conjunto de funciones. Dentro de este conjunto de funciones, voy a devolver render aquí voy a usar una ruta de memoria. Voy a pasar este parámetro aquí y en vez de esto, voy a simplemente el Voy a llamar a la función set. Tenemos que cubrir aquí semicla com aquí. Realicemos de nuevo la prueba. Veremos el cliente de consulta. También necesitamos la consulta rea. Permítame también traer esto y tenemos que cerrarlo. Y también necesitamos el parámetro del cliente de consulta. También copiemos desde aquí. A mi me gusta mostrarte que primero empezamos con nada, luego vendrá el error y luego arreglaremos el error. Podría copiar y pegar completamente de esta prueba, pero me gusta verte cómo me estoy acercando, estoy escribiendo una prueba y siempre que algo no funciona, cómo lo depuro. Ahora en realidad vemos que los errores anteriores se han resuelto, pero ahora tenemos un nuevo error. El componente del editor CK requiere que digas editor, podemos ignorarlo por ahora, incapaz de encontrar una fila. Primero veremos biblioteca de pruebas incapaz de encontrar un elemento x siete con el papel de. Pero tenemos nuestra entrada y necesito que la entrada del título esté aquí. Creo que el papel es solo cuadro de texto. Cambiemos esto a cuadro de texto y veamos qué ha pasado Y maravilloso. Ahora la prueba está pasando. Ahora estoy seguro de que en realidad estoy viendo una entrada dentro de los libros de texto Para las pruebas del editor CK, en realidad, no necesito cargar todo el editor CK. Para efectos de esta prueba, lo único que me interesa es que este componente deba ser renderizado. Y cuando el usuario escribe algo en él y presiona enviar voz, estos datos serían transferidos a la APA. editor CK para nosotros es una dependencia externa, por lo que no necesitamos probar realmente dependencias externas Sólo podemos marcarlo. Para hacer eso, voy y solo voy a agregar esto en la parte superior de mi archivo, voy a reemplazar voy a marcar CK Editor con un en este objeto, que solo lo estoy reemplazando con el área de texto. Esta área de texto tiene un ID de prueba que siempre que quiera obtener este editor, voy a usar este ID. Tiene algún valor diferente si lo pasas y tiene un valor sin cambios. Aquí voy a pero ahora que estoy marcando esto y tengo un área de texto, ahora tengo dos cuadros de texto. Por lo que esta condición será fallida. Por comprobar la existencia del editor CC porque lo he sustituido por la versión marcada. Lo único que tengo que hacer es simplemente verificar que este elemento con este ID de prueba exista. Voy a esperar pantalla que obtenga por identificación de prueba. Esta es también otra función auxiliar del limate de pruebas que podemos asignar a los elementos, un ID de prueba, que podremos usarlo en el futuro para obtener ayuda Estoy esperando que esté en el documento. Y ahora estoy esperando que esta condición se ejecute, pero esta condición fallará porque ahora tengo dos entradas y también espero no ver el mensaje de advertencia porque lo estoy reemplazando el estoy reemplazando CK y esta con la marca segura. Sustituyamos esto por dos y vamos a correr en la prueba. Y ahora la prueba está pasando y tampoco veo el mensaje de error y cómo me aseguro de que estoy probando la corrección si vengo al componente y si elimino esta sección, ahora esta prueba debería fallar porque no he renderizado el ditor CK Si devuelvo esto a uno y si vuelvo a ejecutar la prueba, porque no he cargado el editor CK dentro de mi teléfono, por lo que esta marca no se ha ejecutado y esta condición está fallando. Así que en realidad me estoy asegurando de que se haya renderizado un elemento del editor CK y porque estoy reemplazando un editor CK con un área de texto marcada que solo tiene ID de prueba y estoy probando que este elemento existe. Estoy seguro de que esta prueba es realmente funcional y funciona como se esperaba. Y para que sea mejor ahora que tenemos dos cuadros de texto, puedo volver de nuevo a aquí y para asegurarme también puedo especificar y puedo obtener este primero con la etiqueta o con el título. Para eso, también puedo agregar otra condición aquí, yo diría explicar que se obtiene por textos y el texto es título. Estoy esperando que este también esté en el documento. Ahora en realidad me estoy asegurando de que estoy renderizando el cuadro de texto correcto dentro de mi creación para franqueo Ahora probemos los botones, ya probamos esto. Primer artículo, probamos el Ckeditor y ahora tengo dos Quiero asegurarme de que este formulario también tenga un botón de subir y también tenga una pose subit También puedo hacer eso con esperar pantalla que se pone todo por rollo y esta vez voy a usar el botón roll y estoy esperando ver dos botones dentro de mi teléfono. Hagamos la prueba. La prueba está pasando tan maravillosa. Ahora definiría esto como botones. Voy a definir como una variable botones y se lo asignaré a esto. Ahora estoy esperando que el primer botón tenga contenido de texto de click para subir. Para el segundo botón, estoy esperando que muestre enviar publicaciones. Pongámonos en la prueba. Maravilloso. Ahora la prueba está pasando. Puedes hacerlo así, con definir una variable o también la puedo usar por algo como esto que, por ejemplo, estoy esperando enviar posts y elementos con la idea con el texto de sub costo para estar en el documento. Esta es también otra forma de probar esto. Pero por ahora, solo lo voy a mantener como esto es. Ahora estoy tengo una prueba que se asegura de que el formulario se esté renderizando correctamente y renderizando correctamente. Necesito correr en otra prueba para la interacción del usuario con este formulario. Para esa prueba, estoy esperando ingresar un título. Ingresa una descripción para el post y también selecciona un archivo y subirlo y luego realmente debería llamar para crear post mutación a partir de reacquiri 53. Prueba de escritura para postcreación: Entonces escribamos prueba para eso. Los usuarios pueden crear un formulario de publicación. O simplemente puedo hacerlo sencillo. Mi prueba sería asegurarse de que los usuarios puedan crear una publicación. Pero lo haré mejor cuando escriba la prueba. Por ahora, vamos a ignorarlo. Nuevamente, voy a llamar a la configuración para renderizar los componentes, renderizar todo desde la prueba anterior, sé que tengo dos libros de texto, así que voy a conseguir esto y los llamaré entradas, y para el primero, también necesito eventos de usuario de oído También llamaré a Hs user call user events setup. Porque para esta prueba, necesitamos la interacción del usuario, así que voy a llamar al método type en la primera entrada y luego voy a usar post title. Para el segundo, voy a escribir contenido del post. Ahora necesito un archivo y yo porque aquí tengo un botón de subir. Para eso, voy a usar y esto tiene una etiqueta para que pueda obtener este elemento de formulario con esta etiqueta, pero solo me interesa la entrada de esta imagen. Vamos a juntarlo. Diré una pantalla que obtiene por texto de etiqueta y mi texto de etiqueta será imagen característica. Y entonces voy a hacerlo por ahora, vamos a probar esto para que quede en el documento. Quiero hacerlo paso a paso. Hagamos la prueba. Y está fallando. Veamos qué es lo que es incapaz encontrar un elemento con imagen característica. Veamos que tenemos el contenido, tenemos la imagen característica aquí, el título es imagen característica para que nos aseguremos de que también pueda hacerlo y luego me interesa esta entrada de hecho. O simplemente puedo ingresarlo directamente porque este es el tipo es un archivo. También puedo obtenerlo de eso. Déjame cambiar esto y conseguirlo por eso. Yo diría archivo cons porque ese es mi rol y yo diría que quiero una entrada, pero no quiero todas las entradas. Quiero una entrada que el tipo es es el tipo es cinco. Y la biblioteca de pruebas no proporciona esto, así que de nuevo, necesito sacarlo del contenedor. Voy a conseguir esto voy a recuperar el contenedor de mi archivo de configuración y aquí voy a llamar a contenedores selector de consultas, y luego voy a esperar archivo para estar en el Natural. Vamos a ejecutar la prueba um, y maravilloso no está pasando, así que lo tengo, y ahora quiero subir un archivo dentro de este archivo de entrada. Déjame llamar a este archivo de entrada. Estoy esperando que esta entrada de archivo esté en el documento, luego voy a definir un archivo real. Como constructor como el contenido del archivo, voy a decir que solo el contenido del archivo de muestra no es importante para el nombre del archivo, yo diría que la imagen característica que es PNG y para las opciones, también podemos pasar proceso de opción, por ejemplo, escriba esta imagen, pH. La biblioteca de pruebas nos proporciona una función que realmente podemos subir. Dentro de un elemento, un archivo y el primer argumento serán los elementos de entrada HTML que aquí será entrada de archivo, y la segunda parte será archivo. En realidad, el archivo que queremos subir, porque he usado un peso, así que debería cambiar ACN También puedo agregar un peso para estos dos porque estos dos tipos de usuarios también AC para asegurarme de que mi prueba funcione como se esperaba, también agregaré un peso a esto. También puedo traer este top, vamos a hacerlo un poco más limpio. Y ahora aquí tengo porque ahora tengo un error, el argumento de tipo de nulo no es dejarnos decirle también tipo script que sabemos que este valor existe. Ahora qué va a pasar, ya ingresé algo en el post, ya ingresé algo en el archivo. Ahora voy a presionar el botón de enviar y voy a hacer clic de usuario y obtendría todos los botones. Sé que hay dos botones, así que lo haría también lo puedo conseguir por rollo y pasando un nombre. Vamos a pasarlo en el nombre y el nombre será algo post. Esto también es una sincronización, así que también agregaré un Alight aquí al final, necesito verificar que en realidad se haya llamado la subida Pero agregué tantas líneas, así que por ahora solo hagamos la prueba para asegurarnos de que no rompí nada. Por ahora, se ve bien. Qué pasará cuando en realidad cuando estemos enviando el post este formulario tenga un handle submit y dentro de este handle submit, primero, quiero asegurarme de que esto ha sido llamado y va a crear un objeto format, pondrá todos los valores y luego llamará a la API. Estamos esperando y porque no tenemos el objeto post porque esto es una creación, estoy esperando que se llame a esta pose de creación. Y ya lo hicimos en nuestra prueba anterior. Necesito marcar esta mutación desde reacquery y quiero asegurarme de que esto ha sido llamado y esto ha sido llamado con los parámetros correctos Pasemos a lo que ya hicimos. Hicimos esto por lo mismo con la eliminación. Vamos y llevemos esto. Pero para esta prueba, necesito importar, no usar delete post sino usar Create post. Para que esta línea se ejecute primero, debemos marcar todo el módulo y luego realmente podemos probar. Podemos decir lo que queremos que se ejecute. Voy a marcar post API, usar create post. Para el uso creat pos, vamos a crear un espía aquí Voy a llamarlo crear espía es igual a FM. Solo estoy creando una función vacía que puedo probar si esto ha sido llamado y qué parámetros aspecto. Nuestra condición sería que después de hacer clic en los envíos, estamos esperando que esto cree un espía para haber sido llamado una vez Entonces, hagamos la prueba. En realidad, aquí tengo un error. Si nos fijamos en el código del componente, cuando estamos usando create force, aquí estamos leyendo la propiedad de la asincrónica mutada y aquí estoy marcando la función mutar Debería reemplazar esto para que sea mutar sincronismo. Ahora que estoy usando una opción asíncrona, así que también debería necesitar envolver esto dentro del bloque de espera También voy a envolverlo dentro del bloque de espera. Déjame importar también esperar. También podemos agregar ocho aquí y peso. Volvamos a leer sobre la prueba. Maravilloso. Ahora la prueba está pasando. 54. Prueba de parámetros de createPost: Pero para esta prueba, también quiero asegurarme de que esta función ha sido llamada con el parámetro correcto. Esto es realmente interesante aquí y quiero aprovechar esta oportunidad para enseñarte también otra cosa. No puedo simplemente usarlo los métodos anteriores que he estado usando. Por ejemplo, yo diría que se han llamado W. Porque si paso, por ejemplo, un nuevo formulario data, qué es este formulario data, es un objeto. Y si lo hago algo así, pero esta comparación no existe en los datos de formulario. Cómo podemos probar realmente eso, podemos preguntar a nuestra biblioteca de pruebas de reacción. Podemos pedirle a este Espía todas las llamadas que se ha llamado, y luego podemos hacer nuestra propia comparación para el título, descripción, y también para la imagen. Hagamos eso. Para eso, puedo obtener todos estos parámetros a los que se ha llamado esta función la llamaré para argumentos de datos con esto. Ahora esto es un SPY. Puedo cada SPI tiene un simulacro de función y luego tengo una matriz de llamadas, que es una matriz bidimensional El primer argumento es la primera vez que se le llama porque solo se le ha llamado una vez, usaré cero y el cero será en realidad el primer parámetro al que se ha llamado esta función. Si tuviéramos, por ejemplo, crear un espía con otra cosa, entonces ese sería el índice uno. El número de las llamadas será en realidad el primer índice. Estos son todos los parámetros a los que se ha llamado y este objeto puedo iterar sobre esto y puedo crear un diccionario para mí mismo para todos los parámetros a los que este se ha llamado Por ejemplo, lo llamaré para entradas de datos. Y entonces yo diría, voy a definir un diccionario, que es un registro del anillo a un objeto desconocido. Y luego voy a iterar sobre este argumento de datos de formulario para los argumentos que esta función ha sido llamada, y voy a expandir esto con valor que debería ser no y la clave, que será string voy a llenar mi diccionario con este valor Lo que estoy haciendo aquí es solo un simple flo que estoy leyendo todos estos parámetros a los que se ha llamado este SI y estoy creando un diccionario con una clave y valor para esto. Ahora, puedo asegurarme de que en realidad aquí empieza mi aseveración. Para eso, puedo esperar que ahora que tengo cuatro entradas de datos, ahora en realidad pueda probar el apretado, por ejemplo. Y aquí, porque esta es ahora la cuerda, solo puedo decir que estoy esperando ser anfitrión apretado. Entonces, primero hagamos esta prueba para asegurarnos de que esto realmente está funcionando y es maravilloso. Ahora estoy realmente seguro que el valor que ingresa el usuario dentro de la primera entrada haya sido pasado dentro de mi función create spy, que es una versión espía de la mutación create de la reacquery que realmente llama a la API Me estoy asegurando con esta prueba que todo el formulario, la parte de envío del formulario funcione correctamente. También haré esto para la descripción. Asegurémonos de que está fallando porque ahora debería fallar porque entonces debería ser el contenido del post. Exactamente. Ahora estamos esperando el título del post. Esto debería estar contenido del post y ahora, estoy seguro de que la descripción también está ahí para el foil de imagen, voy a usar y puedo leer esto con la imagen y asegurémonos también de que esta sea imagen. Sí, porque estamos añadiendo una imagen. Quiero que esto solo sea una instancia de un fil. Esperamos que sea un archivo. También queremos asegurarnos de que, por ejemplo, el nombre del archivo y también se haya pasado correctamente. Importar, cuando estoy creando este archivo, también estoy llamando a una edad de características. Tengamos también eso a prueba. Esperemos también que esta imagen tenga el nombre de la página de puntos de imagen característica. Vamos a ejecutar esta prueba esto está pasando, tengo un problema con el script de tipo porque no lo sabe y solo puedo usarlo así como un objeto. Sé que este es un objeto que tiene el nombre es cadena así que solo puedo hacerlo escribir script no se queja, también puedo cambiar esto. Ahora me estoy asegurando de que en realidad prueba, este formulario ha sido enviado con todos los valores que se ha ingresado el usuario. Ahora, hagamos mejor nuestra prueba. Agregué algunos valores codificados, pero ya tenemos el cuidado falso. Vamos a crear aquí estos valores. Voy a definir el título de la publicación aquí. Yo diría falso Permítanme importar primero el cuidado falso de nuestra biblioteca falsificado y voy a usar una oración para el título de la publicación y para la descripción de la publicación Voy a usar un párrafo. Para el nombre de la imagen aquí, agregué un nombre de imagen codificado duro. Yo solo definiría también como un nombre de imagen obtendría falso del módulo del sistema del falso y voy a obtener el archivo y aquí también puedo pasar una extensión que será, por ejemplo, pH. Extensión contras No necesito esto, déjanos hacerlo sencillo. Aquí, en lugar de un valor codificado duro, voy a usar un nombre de imagen y aquí estoy reemplazando este valor por el título de la publicación y aquí estoy reemplazando esto con la descripción de la publicación. Dentro de mi prueba ahora estoy esperando que el título del post sea el título del post. Y la descripción sería la descripción del puesto y también el nombre del archivo debería ser archivo. ¿Cómo lo llamé? Yo lo nombro nombre de la imagen y este debe ser nombre de la imagen. Leamos en la prueba. Sé que cada vez que estoy ejecutando esta prueba, se generarán algunos valores aleatorios para la descripción del título de la publicación y el nombre del archivo y se ve exactamente como los usuarios interactúan con nuestro sistema porque todos usan cosas diferentes, diferentes caracteres y valores diferentes. Ahora estoy seguro que en realidad mi llamada API, mi mutación ha sido llamada con los parámetros correctos. 55. Análisis de la cobertura de código para el componente createOrEditPost: Ahora, veamos el reporte de cobertura de código. Agregamos una prueba para renderizar los cuatro vacíos y agregamos una prueba para crear el post. Entremos aquí y hagamos el reporte de cobertura de código. La primera prueba está fallando y esto es porque agregamos un simulacro. Nos burlamos de esta pose de creación y ahora para la segunda prueba, agregué este Spy pero para la primera prueba esto no existe. Movamos esto a un antes de cada bloque y definamos esto como dentro antes de cada bloque y definamos también esto afuera de Aslett y vamos a anularlo antes de cada uno con la versión espía Ahora no sé no puedo ser el primero y llamémoslo, o también podemos llamarlo con e's simplemente sacar esto completamente a la luz. La primera prueba no tiene ninguna interacción con ella debería estar bien. Ahora la primera prueba también está pasando, vamos a ejecutar el reporte de cobertura. Vamos a nuestro navegador. Vamos a todos los archivos. Estábamos en el puesto de componentes. Ahora estamos por debajo del 90% de cobertura, déjanos verlo. Como puedes ver, la sección de edición no ha sido cubierta. También no se ha cubierto la sección de capturas y estas tres líneas de código no se han cubierto. Para ello, en el siguiente video, también voy y también voy a crear una prueba para este caso. 56. Agregar una prueba para el caso de falla de la API: Justo antes de comenzar a escribir pruebas para estos, hay un punto que debo mencionar. No tienes que, por ejemplo, escribir pruebas para todo. Ahora mismo, tenemos una cobertura del 90%. En muchos recursos y libros, una de las mejores prácticas es tener una cobertura superior al 80%. Oh. Y en realidad, ya estamos ahí, así que puedo ignorar esto. Pero porque este es un video educativo y quiero mostrarles todo el poder y todas las cosas que podemos hacer con la biblioteca de pruebas de reacción, voy a agregar esta línea voy a agregar prueba. Pero técnicamente, después de esta prueba, probaré solo una sola línea de código. Y es que a veces deberías pensar que puedes pensar que tal vez sea demasiado. Si no quieres hacerlo, siéntete libre de no hacerlo. Sólo quiero mostrarte que si quisieras hacerlo, como puedes hacerlo. Entonces escribamos la prueba, y esta prueba es similar a la prueba anterior. Lo único que aquí queremos hacer es así si esta función falla y si fallan las llamadas a la API, queremos asegurarnos de que los usuarios recibirán un mensaje de error. Para ello, voy a copiar todo el bloque y voy a reemplazarlo mensaje de usuarios si crea fase post mutación. Queremos agregar una prueba para el caso de que está fallando. Y ahora que tengo un antes de cada bloque que marca esto y esto es todo exitoso. Para este caso, quiero que esto falle. Y debido a que esta prueba tiene muchos duplicados, también podemos refacturar este tipo de duplicados, pero lo haré y luego Primero vengamos aquí. En lugar de devolver un valor de resultado de marca en lugar de decir que esto está funcionando bien, rechacemos esto con un error que por ejemplo, crear mutación falló. Ahora para este caso, voy a decirle a vitas que quiero que se falle esta marca Quiero simular un error de API y una falla en la APA. Lo que estoy esperando ver cuando esto suceda, estoy esperando que este mensaje se llame a ese error, y este mensaje se le muestre al usuario. También, para ello, creemos un SPI para ello. Diré error. Yo lo llamo mancha de error. Yo diría que FN, espiamos mensaje y error Estoy creando una marca para el mensaje que es error porque quiero probar que esto ha sido llamado. Ahora, al final de la prueba aquí cuando estamos dando clic en el botón de enviar. Nuevamente, esperamos que así se haya llamado. Ya probé todas estas condiciones así que no necesito probarla. Pero esta vez, sé que esto va a fallar. Estoy esperando que voy a agregar un expect B a mi errorSpit time to have been called one and I am expecting it have been called to have been called to have been called with this error message that error and creation of Ya no necesito esta línea, así que mi peso para el comando será que este mensaje de error debería haber sido llamado y debería haber sido llamado con el paramet correcto Maravilloso. Ahora la prueba está pasando, volvamos a ejecutar todas las pruebas juntas de nuevo y veamos que no rompí nada ninguna prueba previa al agregar esta nueva, todas están probando, todas están pasando, maravilloso ahora vamos a ejecutarla con cobertura. Y esta vez, estoy esperando cuando vengo aquí y cuando refresque la página, esta línea no debería ser leída. Veamos juntos y maravillosos. Ahora esta línea también se ha cubierto. Ahora nuestra cobertura se ha incrementado 90-93%. Todavía tengo dos condiciones. Yo uso voy a probar esto en la edición y también escribiré podemos ignorar esto o también podemos escribir una prueba para esta. Sólo otra cosa que quiero hacer este video porque tengo muchas partes o se comparten entre estas dos pruebas, también puedo crear una función auxiliar para eso. Por ejemplo, llámelo, puedo copiar toda esta función y puedo llamarla puedo llamarla interactuar o llenar crear post para. Después de mi configuración, puedo definir esto como una sensación puede definir esta función y ponemos todo este bloque aquí. Y porque todas estas acciones son iguales, así que tengo un error tipográfico, déjame arreglar este error tipográfico y aquí también puedo quitar todas estas partes de la cerradura y simplemente lo reemplazo con esto Ahora es más fácil entender lo que sucede dentro de las pruebas. Volvamos a ejecutar todas las pruebas para asegurarnos de que no rompí nada. Y ahora la función también debería ser una sincronización porque agregué. Estoy usando unos pesos aquí, eso estaba en la prueba. Dentro de mis pruebas también, también debo agregar una evasión aquí, también debo agregar evadir Ahora también necesito estas pruebas necesita en realidad estos valores. También podemos extraerlos de esto. En lugar de no devolver nada, puedo devolver un objeto de título de la publicación, descripción de la publicación, nombre de la imagen y puedo conseguirlos aquí. Yo diría cos post title, post description y image name. Los estoy escribiendo aquí. También tengo un error tipográfico aquí. Volvamos a leer sobre la prueba. También tengo semicol aquí. Leamos en su conjunto describir. Maravilloso. entender si otro desarrollador quiere leer la prueba y ver qué está pasando aquí, es mucho más claro que estamos espiando mensaje ese error, estamos rechazando la promesa, y luego estamos llenando el formulario y luego estamos esperando que nos llamen espía aquí, estamos esperando aquí estamos llenando Ahora mis pruebas están pasando y además es más fácil entender si otro desarrollador quiere leer la prueba y ver qué está pasando aquí, es mucho más claro que estamos espiando mensaje ese error, estamos rechazando la promesa, y luego estamos llenando el formulario y luego estamos esperando que nos llamen espía aquí, estamos esperando aquí estamos llenando el formulario y estamos esperando que haya llamado al espía creativo y también esperamos que los datos de este formulario se pasen con los parámetros correctos. 57. Agregar prueba para la edición de la publicación: Ahora quiero agregar una prueba para la adición. Entonces si tenemos, por ejemplo, porque no probamos esta parte del código, esta parte del código es la misma, pero este componente puede aceptar el objeto post. Si le pasamos un objeto post, entonces estamos esperando que se llame a esta función de edición. Vamos y llevemos toda nuestra función de renderizado. Esta vez quiero pasar un parámetro, así que diría llama lo que usamos, usamos los usuarios pueden crear un post. Hagamos también mejor este mensaje. Digamos llamadas llamadas, crear post mutación cuando los usuarios rellenen el formulario. Aquí yo diría llama a la otra mutación, que es la que llama, editar post mutación. Si se lanza una publicación. Nuevamente, esto va a ser un acing, así que voy a renderizar esta vez y para el post, voy a usar nuestra fábrica de pruebas que hemos creado, obtener post de prueba. Y aquí voy a pasar el objeto post aquí. Yo diría post igual a post. También necesito un cliente de consulta. Tambien traemos un cliente de consulta para este. Esta será nuestra función de render. Tengo una necesidad también en esto para Ahora estoy renderizando lo mismo con el anfitrión. Puedo usar la misma función auxiliar que he creado. Entonces puedo hacer todas las interacciones que tuve con los cuatro pero ahora necesito un nuevo spi también traeré todo este bloque aquí Pero entonces simplemente no necesito crear espía, también voy a crear una función phon Edit posts, spy I also here spy the whole spy the second mutation which is use Edit posts. Voy a copiar este bloque. Voy a esta vez voy a usar Edit post, llamarlo marca y esta vez para la tarea para el espía, vamos a usar Edit post. Por supuesto, si estoy haciendo esto primero, debería marcar todo el módulo, así que voy a la parte superior de este archivo, también voy a marcar usar Editar publicación. Y luego después de eso, estas líneas serán ejecutadas. Tengo el post de edición. Ahora estoy esperando que esta vez, estoy esperando que se corte mi postpe de edición y los parámetros que estoy leyendo de él serán a partir de este momento Ejecutemos la prueba y veamos qué va a pasar. Tenemos un error, vamos a depurarlo juntos, encontramos múltiples elementos roll con el botón name de los posts submit. Ahora tenemos un antes de cada bloque y dentro antes de cada bloque, creo que ya tenía la configuración enviar post, enviar post entonces tenemos el contenido. Tenemos la imagen característica dentro de nuestro contenido y pero no llamé a la configuración en esta función. Creo que aquí tenemos la configuración. Por lo general, configuramos contenedores iguales. Debido a que tengo el contenedor aquí que está llamando a la configuración ahora, estoy renderizando los cuatro dos veces y este formulario de campo en realidad también hace esto. Por ahora, dejémonos Por ahora, permítanme simplemente copiar todo el bloque. Aquí adentro en vez de esta línea, voy a usar esta. Tiene tanta duplicación, pero por ahora, podemos ignorarla. Veamos si esto va a resolver nuestro problema. Porque ahora estoy renderizando mi componente aquí. La prueba nuevamente está fallando, y también debería quitar esta línea, todo el propósito era eliminar esta línea y traer aquí la llamada a la función. Nosotros también el contenedor. Déjenme traer también el contenedor aquí. Nuevamente fallando formulario argumentos de datos que para cada uno no es una función. Veamos aquí estamos obteniendo un ppi de edición. La forma ha sido llamada una vez, por lo que esta función ha sido alineada. A partir de ahora eliminemos estos códigos y volvamos a ejecutar la prueba. Ahora, estoy seguro de que en realidad mi espía de edición ha sido llamado porque si estaba fallando, debería haber fallado en este registro vamos a depurarlo, así que veamos qué está pasando. Y bien, maravilloso. Ahora, depurémoslo juntos. Cuando la publicación de edición está llamando, en realidad, recibirá un objeto que tiene un ID y tiene una propiedad de los datos del formulario y el ID es el ID de la publicación y los datos del formulario son para theta Anteriormente, solo estábamos pasando el primer argumento como los datos completos del formulario. Ahora que estoy haciendo esto, en realidad esta esta es la identificación porque estoy usando las primeras publicaciones, y luego vamos a duplicar esta línea. Necesito y lo siento, este es todo el objeto. Este es el objeto completo al que se ha llamado, que es éste, ID. Así que vayamos y llamemos así a esto. En vez de decir, yo diría un objeto, y estoy leyendo un formulario de datos. La primera llamada será este objeto para los datos del formulario, luego voy a iterar sobre esto Esta vez, no debería ser un problema. En realidad, no, está fallando porque también es otra cosa interesante que puedo discutirlo y te puedo enseñar. Ahora que estamos pasando un objeto post aquí, entonces esta entrada, las entradas que ya tenemos tiene un valor. Y cuando me vaya y cuando esté escribiendo algo dentro de esto, se le añadirá a eso. Para eso, primero voy a borrar la entrada, y me gustaría que el usuario ingresara esa clara para que sea una para que se vacíe y luego agregarle algo. O simplemente puedo eliminar todos estos objetos, y luego diré, para esta prueba, solo quiero agregar un dos. Cómo lo probamos manualmente si vengo aquí y si, por ejemplo, presiono editar aquí, si quiero probar manualmente, a veces solo voy a agregar un número y luego aquí voy a ver que se ha cambiado, así que esto es bueno. Para esta prueba, voy a justo dentro del título, voy a agregar esto y luego lo estoy esperando en lugar de este valor aleatorio, voy a esperar que tenga mi título del post más este nuevo valor que he agregado. Por ahora, eliminemos estas líneas. Asegurémonos de eso solo para probar si esto es trabajo. Y maravilloso. Ahora mi prueba en realidad está pasando. Para esta prueba, también puedo hacer lo mismo por el nombre de la imagen. También puedo hacer esto por lo mismo. Vamos y en vez de pasar en realidad un valor solo añadimos descripción al valor que ya está ahí y es también nos dice que prefiere usar un objeto de templo Cambiemos esto para que sea así y cambiemos también para ser post la descripción anterior que tenía el post, y luego estamos agregando una descripción. Estamos agregando una descripción para esta, para la imagen porque este es un botón de subir, la imagen será reemplazada para que pueda dejar la imagen como estaba antes, así que solo puedo ir y puedo traer aquí la misma línea falsa Y ahora estoy esperando que esta prueba esté pasando. Déjalo ver juntos. Maravilloso. No verifiqué ID, así que probemos también que en realidad se llamará a la publicación de edición con el ID correcto. Estaba agregando una expectativa y estoy esperando que sea post ID. Hagamos la prueba. También estoy esperando que esto se apruebe. Ahora hagamos todas las pruebas juntas para asegurarnos que no rompí nada durante estos cambios. Tan maravilloso está pasando. Volvamos a ejecutar la prueba con la cobertura para ver también el reporte de cobertura Esta vez, espero que estas dos líneas también hayan sido cubiertas. Y maravilloso. Esto ha sido cubierto. También me puede gustar exactamente lo que hice con el mensaje ese error. También puedo probar eso. Cuando la edición es exitosa, estamos viendo dentro de nuestro código fuente que estamos mostrando mensaje de ese éxito. Tengamos también eso a prueba. Aquí antes de renderizar, voy a llamar mensaje. En lugar de espiar mensajes y errores, vamos a espiar al éxito Entonces y voy a llamarlo spot de éxito. Cuando esto haya terminado, cuando todo esto se haya hecho, también estamos esperando que ese espía de éxito haya sido llamado una vez y también esperamos haber sido llamado con este mensaje que es post ha sido actualizado exitosamente. Volvamos a ejecutar todas las pruebas. Y maravilloso. Ahora mi prueba está pasando. También se ha incrementado la cobertura. También agregué esta prueba para estas dos líneas. La cobertura se ha incrementado de 93% a 96%. Y en el siguiente video, voy a poner esto como un ejercicio para ti. También puedes agregar prueba para esto. Aquí, teníamos la condición de que si el post no existe, significa que es un archivo create post. Y no lo estamos editando porque estamos creando. Si los usuarios no seleccionan un archivo, mostraremos un mensaje de error y si quieres verlo dentro de nuestro blog, si escribo título aquí y si escribo contenido, pero si no selecciono una imagen característica e intento enviar, entonces veremos este mensaje de error. También puedes agregar una prueba para esto. Esto va a ser divertido. Por favor, detenga el video y agregue una prueba usted mismo. 58. Agregar una prueba de validación para la selección de imágenes: Entonces, vayamos a la parte de la solución. Añadamos la última prueba y terminemos esta conferencia. Para la última prueba, diría que muestra un mensaje de error si los usuarios no han seleccionado un archivo. Después de que a veces escribir pruebas será mucho más fácil porque ya creé todo lo que necesito de los ejemplos anteriores. Lo único que necesito es sólo copiar y pegar todas las cosas que ya tengo. Vayamos y llevemos En realidad, esta es más fácil de copiar esta vez porque necesitamos espiar el mensaje ese error, así que voy a reemplazar todas estas cosas. Traeré todos estos valores de mi archivo de configuración, no necesito el valor de retorno, solo los traeré para esta última prueba aquí en lugar de no ingresar el nombre de la imagen. Voy a quitar esta línea, eliminaré la creación del archivo. Elimino la entrada del archivo, obtengo la entrada del archivo, elimino el archivo de carga y solo estoy enviando el formulario con este valor vacío porque no necesito subir archivo, tampoco necesito este contenedor, hagámoslo Sencillo aquí solo estoy generando un post title post description. Tenemos un antes de cada trama que siempre marca la creación con un mensaje exitoso. Para esta prueba, queremos que sea exitosa no queremos ingresar no queremos ingresar a la salida del archivo. Después de eso, esperamos sea mensaje de error para ser llamado con este mensaje de error. Vamos y por primera vez, intentemos dejar que falle para asegurarnos de que en realidad estamos probando lo correcto. Hagamos esta prueba. Y ves que exactamente está llamando, espera que se llame con este mensaje. Entonces voy a agregar esto y voy a ejecutar la prueba. Esto fue fácil 2 minutos para escribir esta prueba porque agregué ya todos los demás casos. Y esto es realmente interesante con probar que cuando tienes algunos al principio, se ve complicado. Parece que consume mucho tiempo. Pero después a veces solo se está volviendo mucho más fácil porque tienes todo lo que necesitas para tu prueba. Estoy ejecutando la prueba con la cobertura, estoy refrescando la página y maravillosa. Ahora estas líneas también han sido cubiertas y ahora tengo el 100% para este componente. Todas las líneas, todas las ramas, toda la función, y todo ha sido cubierto para esta prueba. 59. Resumen del módulo de pruebas de integración: Todo bien. Enhorabuena. Has terminado este módulo. Este fue un módulo duro. Sé que hemos cubierto muchos temas con prueba de escritura para crear y editar post. En realidad, aprendimos mucho. Aprendimos cómo podemos realmente ingresar algo en el área de texto con el usuario de ese tipo. Hemos aprendido cómo podemos escribir pruebas y simular la carga del archivo para un formulario También aprendimos a marcar editores complejos como CCA Editor y simplemente reemplazarlos por un área de texto normal . También hemos aprendido sobre la API de éxito y fracaso porque escribimos pruebas para diferente situación si la API funciona y cómo podemos simular un error en la API que estamos mostrando el mensaje de error a los usuarios y además implementamos pruebas para lógica de validación así. Si el usuario no ha seleccionado un archivo y quiere crear una publicación, entonces la aplicación muestra un mensaje matutino, y también escribimos prueba. Este fue un módulo muy avanzado, así que estoy muy contento de que lo hayas terminado. Es el momento. Consigamos tu tiempo y hagamos un descanso rápido. Estoy muy orgulloso de ti, y espero que uses todas estas cosas que has aprendido en este módulo en tus futuros proyectos. 60. Introducción a las pruebas finales finales 2: Entonces comencemos con el fin de diez pruebas. Enhorabuena por terminar las secciones anteriores. Estoy muy orgullosa de ti de que hayas recorrido este largo camino. Y en este módulo, vamos a hablar de terminar diez pruebas. Y lo que es terminar las pruebas gemelas, vayamos y hagamos una revisión. Hablamos de las pruebas unitarias. Dijimos que las pruebas unitarias se centran en una unidad, que es una función o clase. Y en las pruebas de integración, estamos probando la integridad entre diferentes componentes y módulos. Pero al final de las pruebas gemelas, estamos viendo el software como un todo. Entonces no nos importa en qué tecnología se haya escrito. Puede ser de reacción, angular, vista o cualquier otra cosa. No sabemos qué está utilizando la tecnología de back end. Puede ser CSO, Java, JS o cualquier otra cosa. Y en las pruebas a término, estamos viendo el software como un todo, y estamos probando el comportamiento esperado de este software. Y volvamos de nuevo y pensemos en las pruebas por bit. Entonces primero, comenzamos con pruebas unitarias, que eran muchas rápidas y baratas de escribir. Y ahora queremos escribir fin de pruebas Gemelas. Y haciendo pruebas desde el número, hay menos, mucho menos que la prueba unitaria, y son menos también que las pruebas de integración Y ejecutar este tipo de pruebas es más lento relación con la prueba unitaria y en relación con las pruebas de integración. Y por lo general para los desarrolladores y para las empresas, son caros. Entonces, desde el momento en que los desarrolladores necesitan poner de los recursos que requieren y desde el momento para su ejecución. Y ahora queremos comenzar con este módulo con el test gemelo final y con dramaturgo Así que empecemos, y comencemos con la instalación de dramaturgo 61. Instalación de dramaturgo: Para escribir pruebas unitarias, estamos utilizando dramaturgo Dramaturgo es una herramienta para diez pruebas, escritura, y ¿qué hace? En realidad abre un navegador, un Corum He Firefox o Safari y luego lo renderiza visita el sitio web que quieres probar, y luego está actuando como lo que hace un probador normal Se abre la página y luego se puede tener diferente condición de que, por ejemplo, este texto deba ser visitado o este enlace cuando haga clic en él, algo debería suceder. Si envío este formulario, debería ver este mensaje y luego la página debería ser redirigida a esta página Todas estas condiciones, podemos probarla con dramaturgo Entonces comencemos instalando presa bien. Estoy dentro de mi terminal, y aquí, si hago un LS, verán que tengo dos carpetas. Uno es para el blog simple y otro es para el back end. Voy a crear una carpeta y la llamaré prueba TN, y después voy a ir a esta carpeta y a instalar dramaturgo , voy a ejecutar este comer NPM ElenPlayWT voy a ejecutar este comer NPM ElenPlayWT Voy a rezar. Y me va a preguntar, ¿necesito escribir script o Javascript? La opción predeterminada es escribir script. Voy a escoger el script de tipo y donde querer poner tu prueba gemela, la predeterminada es una carpeta de prueba, así que aceptaré también la predeterminada. Y la siguiente pregunta está en el flujo de trabajo de Git of action. ¿Y qué significa esto? Por lo general, en las empresas y en el entorno de producción, estamos usando el calor de acción que cada vez que ocurre una fusión en nuestra sucursal principal, se debe ejecutar una tubería y esa tubería está ejecutando toda nuestra prueba Twin. Por ahora, no necesitamos eso, así que iré con la opción de no. Y la siguiente pregunta será qué navegadores dramaturgos, ¿necesito instalar Voy a elegir la opción predeterminada que por defecto instalará los tres navegadores principales. Simplemente lo voy a cambiar como cierto, lo configuré y luego ahora en realidad está instalando y está descargando el navegador. Como puedes ver aquí, por ejemplo, primero, se inicia instalando Colombio Esto también es interesante para que veas que realmente descarga el navegador, en realidad está probando todo el software exactamente de la misma manera que un navegador y un usuario y un probador funcionan con el software. Y y ahora en la siguiente sección, se trata de descargar Chromium headless, Chromium headless es la versión de Chromium que no tiene la interfaz de usuario que trabaja un usuario normal Entonces, como usuario normal, cuando estamos trabajando con un con la habitación, tenemos estas ventanas. Tenemos todas estas cosas, y Corobu headless solo tiene las API para Corom que renderiza y para las pruebas, solo necesitamos la parte headless del navegador Y aquí los estás viendo, empieza a descargar el firefox y luego empieza a descargar la web. Y estos son los tres principales navegadores que hace el dramaturgo Esto también vuelve a ser interesante que cuando escribimos pruebas con dramaturgo, en realidad, estamos probando nuestro software con diferentes navegadores Y esto también es muy importante que estemos seguros de que nuestro sitio web funciona y nuestra aplicación web funciona correctamente en diferentes navegadores. 62. Ejemplos de pruebas de dramaturgos: Entonces se ha instalado, y también verás que este es el ícono del dramaturgo y también lo podemos ver aquí Dramaturgo viene con algunas pruebas por defecto para ejecutarlas, podemos ejecutar esta prueba de dramaturgo PX Y estas son algunas pruebas predefinidas solo para asegurarnos de que hemos instalado correctamente al dramaturgo, y verán que se ha superado toda esta prueba, y ahora puedo confirmar que en realidad mi instalación ha sido exitosa Genera un reporte de HML, y podemos verlo ejecutando este comando y show de dramaturgo de cerdos Aquí, cuando ejecutes eso, tendrás una página de página y la abriré en host local. Verás que tengo una prueba la cual ha sido ejecutada contra Combo. El segundo, esta es la misma prueba se ha ejecutado contra Firefox y este es el mismo caso se ha ejecutado contra bk. Entonces tengo otra prueba que es obtener una fuga iniciada y la misma se ha ejecutado contra diferentes navegadores. Aquí también verás el tiempo que tardó en ejecutarse cada una de estas pruebas. Si hago clic en él, también verán los pasos que, por ejemplo, tiene un antes, que es una configuración e instalación y luego visita esta web, que es la página oficial del dramaturgo y luego espera ver el texto del dramaturgo y luego hará algún tipo de afterhoks Veamos La otra prueba es, de nuevo, que visita el sitio web del dramaturgo y luego está buscando un enlace el cual es empezar y luego da clic en él Déjanos verlo también. Aquí tenemos este enlace el cual es empezar. Esta prueba es en realidad para este botón, luego hace clic en él, y luego espera que vea una página con el encabezado de la instalación. Veamos juntos. Si hago clic aquí, verán que tengo una página con el encabezado de una instalación y esto es exactamente lo que hace esta prueba. Y para ejecutar pruebas en dramaturgo, también hay otra opción, que es ejecutarlas dentro de un modo UI Y también te puedo mostrar aquí. Entonces si ejecuto la misma prueba cubierta y NPxPat, y si agrego UI, se abre el modo de prueba en la forma UI del dramaturgo Y aquí verán que tengo una ventana y tengo dos pruebas. Puedo ver mi prueba, y aquí puedo ejecutarlas. Y aquí verás que en realidad lo que está pasando. Entonces primero visita un sitio web de dramaturgo y luego espera ver este texto dramaturgo y luego hará algún tipo de limpieza Para la segunda prueba, también puedes ejecutarlo aquí, y verás que primero llegó a esta página y luego hizo clic en este botón, y luego espera ir a esta página y ver este texto de instalación 63. Métodos y ayudas del dramaturgo para hacer pruebas: Y veamos los métodos dramaturgos que hemos utilizado en las pruebas de ejemplo anteriores Tenemos algunos métodos básicos, page dot GT, por ejemplo, esto es lo primero que realmente con esto, podemos decirle al navegador que el dramaturgo está usando para visitar una URL Y luego como biblioteca de pruebas de reacción, tenemos G por rol y podemos consultar desde el HTML de la página en base al botón de enlace, entradas, texto o y podemos obtener este elemento. Y para condiciones exactamente como probamos que teníamos en los videos anteriores, tenemos una expectativa. Tenemos algunos matchers como para tener título, podemos probar que un elemento, un título existe dentro de la página Tenemos que ser visibles, que es lo que es similar a estar en el documento de biblioteca de pruebas de reacción. Y ahora que has aprendido test, ahora que has aprendido a reaccionar probando biblioteca, aprender dramaturgo será mucho más fácil porque conoces la terminología, sabes cuál es el propósito de la prueba y lo que vamos a probar, y será mucho más fácil implementar también prueba T. Y también abrí el proyecto en mi ID, así que he creado esta prueba T. Vamos y veamos los ejemplos de prueba. Y aquí verás también puedes ir a la carpeta de prueba. Entonces veamos primero éste. Esta es en realidad la prueba de ejemplo que hemos realizado. Y como pueden ver aquí, tengo dos pruebas, pero veremos seis porque cada prueba se ejecutará con respecto a tres navegadores, Chromium, Firefox, y kit web. Y aquí se puede ver que tengo el teclado de prueba y esto viene de dramaturgo y la prueba exactamente igual que lo que vimos en la biblioteca de prueba y reactesm, tenemos una descripción para la prueba y tenemos la función, que es la mayoría de las pruebas de dramaturgo son AC porque cuando vamos a cuando estamos visitando una página, esta es una esta es una Entonces tenemos este AXI de playd recibiremos un objeto de página, que podemos hacer métodos en él Por ejemplo, podemos llamar al ir a para visitar una página, y podemos esperar también esta página. Entonces aquí estamos primero a la espera de esto para asegurarnos de que esta acción se haya terminado. Entonces navegador abre esta página porque esto requiere una solicitud de red. Puede ser asíncrono y así agregamos una espera aquí. Y luego aquí, estoy esperando que esta página tenga este título. Cuando lo escribimos así, es mirada es un rejix así que no es fuerza exacta sino que es un Y para la segunda prueba, nuevamente estoy viendo esta URL. Nuevamente, voy a recibir una página como parámetro y luego estoy de visita y ya sabes que ya has visto sintaxis. Primero, obtendrá un enlace. Pero si estás obteniendo enlace, hay muchos enlaces, por lo que también agregará otra condición para comenzar y luego da click en este enlace. Nuevamente, tenemos la espera aquí y luego estamos esperando ver para visitar una página que tenga un encabezado y ese encabezado debería ser instalación. Estos son los dos ejemplos de casos de prueba que vimos en la zona. 64. Escribir nuestra primera prueba de E2E: Todo bien. Empecemos y escribamos nuestra primera prueba con Playt Y voy a probar mi página, y voy a implementar exactamente la misma prueba que quiero visitar este sitio web, y después quiero ver algunos elementos en ella. Entonces abrí la navegación abrí el proyecto en mi ID, y voy a copiar toda la prueba aquí. Voy a ponerle nombre a la sección de blog. Aquí voy a definir una variable para la URL. Voy a usar. Voy a almacenar esto como una variable aquí exactamente igual que la prueba de ejemplo, voy a visitar esta página. Estoy esperando qué título voy a ver el título es lo que vamos a ver aquí, simple página de bloque. Estoy esperando cuando visite eso para ver la página de bloqueo simple y el idioma. Esta es una prueba fácil, así que vamos a ejecutarla y veamos. Como pueden ver, ahora tengo esta ventana y voy a ver el cromo web cube, firefx probado contra diferentes navegadores y todas estas pruebas han sido superadas Enhorabuena. Hicimos nuestra primera prueba en dramaturgo 65. Prueba el encabezado del blog: Y veamos también y asegurémonos de que veremos un encabezado correcto para nuestro sitio web. Voy a agregar otra prueba. Voy a copiar todas estas secciones y voy a llamarlo tiene encabezamiento correcto. Al igual que la página anterior, vamos a visitar la página. Aquí ahora quiero obtener este elemento, que es un elemento H one. Lo conseguiré por localizador de puntos de página. Aquí puedo pasar H uno, puedo conseguir un selector y esto me dará el H uno para esta página. Entonces puedo decir que estoy esperando que este H one tenga texto. El texto será algo que espero ver aquí. Me voy y estoy diciendo que para esta prueba, estoy esperando que vea sangre simple creada por. Hagamos esta prueba, maravilloso. Ahora también está pasando. 66. Prueba de evento de clic y navegación entre páginas: Para la siguiente prueba, también quiero visitar esta página y luego obtener el primer elemento y luego hacer clic en él y asegurarme de que realmente estoy viendo el título de ese artículo post dentro de mi página. Es un poco más complicado. Requiere de múltiples pasos, así que hagámoslo juntos. Cambiemos esta prueba y vamos a llamarla los usuarios pueden ver una publicación haciendo clic en ella. Como primer paso, nuevamente, voy a visitar la URL. Voy a conseguir una voy a conseguir todas las hojas, y para eso, me voy pero no quiero limitar en base al título o en base a ninguna condición. Entonces voy a eliminar esta condición, y también voy a quitar el botón de acción y voy a cambiar esto para llamarlo obtiene enlaces y voy almacenar los resultados en la variable. Para la primera condición, en realidad espero tener tres enlaces y veamos si esto está funcionando o no. Simplemente agreguemos una condición de espera. Digamos que nosotros y definamos estamos esperando que los enlaces de conteo sean tres. Definamos también estos enlaces de conteo, que serán la tarjeta de puntos de enlaces. Quiero almacenar quiero almacenar el número de los enlaces, y quiero probar si veo tres enlaces. Hagamos esta prueba. En realidad, está fallando, y verán que estoy recibiendo tres pero estoy esperando tres, pero estoy recibiendo seis. Porque aquí también tengo otros elementos, también tengo, por ejemplo, estos elementos meno. También son enlaces. Hagámoslo más específico. Inspeccionemos y veamos el H t de la página. Aquí tengo una A y dentro, y esto está dentro de un DV y tengo la sección principal. De hecho, puedo acotar mi selección para que solo esté buscando dentro del área principal. Oh, hagamos esto. En lugar de buscar dentro de toda la página, solo quiero obtener los enlaces que están dentro de esta etiqueta principal. Entonces déjame primero obtener la sección principal. Vamos a venir aquí y vamos a obtener la sección principal. Y puedo hacerlo por localizador de puntos de página. Y aquí voy a pasar selector, y esto me va a dar un subconjunto, toda la tabla H dentro de esta etiqueta principal. Entonces en vez de obtener todos los enlaces y en vez de consultar Obtener por rol en la página, voy a cambiar este get en la sección principal. Y voy a cambiar esto a principal. Entonces estoy ejecutando el mismo requisito, misma consulta, get by roll, pero no lo estoy ejecutando dentro de toda la página. Voy a ejecutarlo sólo para la sección principal. Hagamos la prueba, y esta vez espero que la prueba sea aprobada y maravillosa. Ahora mi prueba está pasando, estoy aquí dentro de esta área y ahora mi siguiente paso sería en realidad dar clic en la primera y asegurarme de que estoy viendo el título correcto. Y así voy a añadir dos condiciones. La primera condición sería en realidad ver este texto cinco monturas llevando recibo. Y entonces mi segunda condición sería cuando haga clic en él, estoy esperando ver una página que tenga este título. Hagámoslo. Voy a esperar que mi primer enlace haga que los enlaces tengan texto. Déjame cambiar esto. Estoy esperando enlaces. Voy a obtener el primer enlace por este método NTH y estoy pasando un índice Estoy diciendo que estoy esperando que esto tenga el texto de que estoy esperando cinco recibos de riego encuadernados, hay que probar de esta manera. También necesito agregar hormiga porque cada vez que en realidad estoy llamando a un método y contando u obteniendo un método, esta también es una operación azing Volvamos a ejecutar la prueba y la prueba está pasando tan bien, voy a ver este texto y ahora voy a dar click sobre esto en el primer enlace Y lo que va a pasar cuando haga clic en es, voy a ir a una página y dejarnos ver qué es esto. También creo que se trata de una H dos. Entonces estoy esperando también estar en una página que estos t existe ahí como un H dos. Y ya lo hicimos aquí. Entonces voy a copiar lo mismo. La voy a usar aquí. Esta vez, solo usaré un localizador H two y mi condición sería exactamente así. Entonces voy a esperar que H dos tenga texto, este será el texto que yo soy este este es el texto que espero ver. Esto también es un. agreguemos también una Imagen y agreguemos también un ps y hagamos la prueba. Y maravilloso. Enhorabuena. Necesitamos una prueba. Hicimos una muy buena prueba primero lo que vamos en este sentido, primero, estamos visitando nuestra página de inicio. Entonces estamos consiguiendo todos los enlaces que se encuentran dentro de esta área principal. Entonces estamos probando para ver tres posts, y luego estamos probando que el primer enlace debe tener este texto. Y luego vamos y en realidad estamos dando clic en este texto, y estamos esperando tener una etiqueta H dos, y esta etiqueta H dos también debería tener este texto. Entonces ahora nos estamos asegurando de que todos nuestros usuarios puedan hacer clic en este elemento, y cuando hagan clic, irán a una página que tenga una etiqueta H dos y el título de la publicación está ahí. 67. Introducción a la interfaz de usuario de Playwright: Ahora que hemos escrito algunas pruebas, quiero mostrarte la interfaz de usuario del dramaturgo Hasta ahora, solo volví a ejecutar la prueba en modo headless, lo que significa que no interactuamos con Dramaturgo directamente, solo nos estábamos quedando sin código y luego Dramaturgo estaba ejecutando estas pruebas y nos estamos diciendo si las pruebas están bien Y para poder ver la interfaz, podemos ejecutar este comando N px Dramaturgo prueba UI, y esto abrirá la interfaz de usuario del dramaturgo Entonces aquí verás, déjame hacer esta pantalla más grande. Entonces aquí verás que tenemos una sección de sección de bloque, que es la prueba que tenemos aquí. Dentro de esta sección de bloque, tenemos tres pruebas para cada una de ellas, verás que en realidad tenemos un ítem y la descripción viene de aquí. El primero es tiene título. El segundo tiene encabezado correcto, y el tercero es los usuarios pueden ver un post haciendo clic en él. Esto también los usuarios pueden ver una publicación haciendo clic en ella. Y junto a cada ítem, tenemos este botón Ejecutar que inicia si hago clic en él, verás que va a ejecutar la prueba. Aquí tengo la oportunidad de ver un navegador y de ver exactamente lo que está tomando el dramaturgo de acción Si estás escribiendo una prueba y de alguna manera tu prueba no funciona, esto te dará una muy buena herramienta para depurar porque verás todos los pasos Ese dramaturgo está tomando en el navegador, y luego puedes ver qué está sucediendo exactamente y por qué tu prueba no funciona Y la primera prueba es realmente sencilla, por lo que es solo verificar que el título sea correcto. El segundo también es cheques solo para este elemento, y como pueden ver, también lo ha hecho audaz para nosotros para que podamos ver qué es lo que está probando. El tercero es un poco más complicado. En realidad estamos visitando la página de inicio y luego estamos haciendo clic y déjanos ver qué está pasando. Cuando ejecute esta prueba, verán que en realidad hizo clic y estamos en el primer post y con el ID del uno y luego aquí también nos mostrará lo que está pasando y lo que está probando Esta es una interfaz de usuario realmente buena que también podemos usar cuando estamos trabajando con Dramaturgo para la depuración y para ver lo que realmente está sucediendo. 68. Ejecutar a Dramaturgo en el modo de depuración: También hay otra opción en el dramaturgo, que es realmente útil desde la depuración Y en este video, te voy a mostrar eso. Así vimos el modo UI del dramaturgo en el video anterior, y ahora voy a ejecutar Dramaturgo con el modo del debug Para ello, escribiré NP, pruebas de dramaturgo depurar. Cuando hago esto, Dramaturgo se abre en el modo de depuración. Tenemos dos ventanas. La primera ventana es en realidad nuestro navegador y la segunda ventana es el código fuente que tenemos para el dramaturgo Como pueden ver, se ha detenido en esta primera línea. Estamos en la primera prueba prueba tiene título, y luego se ha detenido en esta línea. Si presiono este botón resium, ejecutará el código y luego pasará a la siguiente prueba Esta es la segunda prueba y luego vamos a la tercera prueba y esta también se ha ejecutado la tercera. Prueba. Ahora estamos en el archivo de ejemplo del dramaturgo Déjame también pasar por estas dos pruebas y voy a ejecutar estas dos pruebas. Ahora verás que se ha movido al siguiente navegador. Anteriormente, estábamos probando en el Corum ahora estamos en Firefox, así que también puedo ejecutar la primera prueba con este botón, ejecutar la segunda prueba, tercera prueba, y luego va al al ejemplo Dramaturgo nos proporciona Voy a ejecutar la primera prueba y la segunda prueba y ahora vamos a lanzar el webkit, que como pueden ver en mi depuración, ahora Dramaturgo está tratando de depurar y ejecutar esta prueba contra el Simplemente los presionaré para terminar todas las pruebas. Como pueden ver ahora se ha superado 15 pruebas y ahora podemos ejecutar este comando para ver todo el reporte, lo cual ha ocurrido. Verás aquí que, por ejemplo, la primera, esta es la sección Bloquear en el Comium las tres primeras pruebas se han pasado en el firefox se han pasado en el sitio web, se han aprobado Para cada uno de ellos, veremos cuánto tiempo se ha tardado. Este es también el ejemplo que brinda la playwrite. 69. Añadir puntos de ruptura con la ayuda del método page.pause: Pero qué pasa si en realidad quiero depurar mi prueba y quiero tener algún tipo de punto de interrupción que cuando llegue el código haya una parada y no se continúe Y para ello, puedo cambiar mi prueba, por ejemplo, la prueba Tetext, que es un poco más complicada Veamos qué está haciendo. Entonces primero estamos visitando la página principal, luego estamos seleccionando el principal y luego estamos obteniendo todos los enlaces. Y luego estamos contando los enlaces, estamos esperando que sean tres, y luego estamos esperando el primer enlace tenga este texto, y luego estamos dando click en este enlace. Imaginemos que por alguna razón este clic después de este clic, no estamos seguros. Tenemos un problema que queremos depurarlo. Puedes agregar esta línea de código evadir página punto POS. Y le dirá al dramaturgo que se detenga en esto y luego podré ver lo que realmente está pasando Hagámoslo juntos. Déjame detener este proceso y dejarnos ejecutar al dramaturgo con la opción de depuración con el modo de depuración para que podamos ver la interfaz, podamos ver el código y para el primer caso de prueba, estoy bien con el primer caso de prueba No tengo ningún puntero de break para el segundo también. Pero para el tercero, ahora veremos que en realidad el depurador se detuvo en esta línea Y aquí estoy viendo lo que realmente está pasando. Imagina Imagina que tengo un problema y dentro de mi texto, estoy requiriendo tener una H tres. Pero en realidad los elementos que debo buscar es un H dos. Eliminemos esta línea. Déjame detener el depurador y vamos a ejecutar esta prueba. Ahora esta prueba fallará. Pero no sé cuál es el problema y cuál es la razón por la que realmente está sucediendo. Ahora verán que tengo este problema con las pruebas, así que todas ellas están fallando y luego dice localizador H tres y no se encuentra el elemento. Estoy recibiendo a este paso después un clic y después de algo de navegación, así que es mejor para mí ver realmente lo que está sucediendo y depurarlo. Vamos y hagamos la prueba con el depurador. Antes de esta línea, antes de hacer clic, voy a agregar de nuevo, page dot Pause vamos a iniciar el depurador del dramaturgo y saltemos la primera prueba y luego la segunda prueba y luego hagamos la tercera prueba Aquí con la ayuda de esta página ese gato, hecho puedo ver en qué ubicación se mi navegador y qué está pasando dentro de la página Aquí puedo, por ejemplo, usar la herramienta chrome inspeccionar elemento para ver qué elemento voy a capturar. Aquí ahora puedo ver, tengo una H dos dentro de mi prueba, estoy pidiendo H tres. Ese es el problema de que mi prueba no funciona. Y con este depurador, puedo depurar fácilmente Puedo agregar esta línea de trayectorias de página en cualquier parte de mi prueba que quiera y luego jugar bien se detiene ahí. Entonces puedo ver lo que está pasando dentro de la página, dentro del navegador y luego puedo tratar entender el problema y me va a ayudar mucho depurar mi prueba. 70. La estrategia de localización y los métodos getBy* de Playwright: En esta sección, quiero hablar G por métodos que Dramaturgo proporciona Como ya vimos, hemos utilizado G B en la prueba previa. En este video, voy a profundizar un poco más en esta sección y en estos métodos. Y G por métodos son estrategia de localización de Dramaturgos que podemos encontrar y detectar algunos elementos que existen dentro de nuestra página Se han inspirado en probar biblioteca que en la sección anterior hemos visto y la hemos utilizado. Pero la idea principal introducida por primera vez en la biblioteca de pruebas y luego Dramaturgo también usa la nomenclatura y la misma convención de la biblioteca de pruebas Y la idea detrás de G por métodos es que estamos detectando los elementos de la página la misma manera que el usuario interactúa con nuestra aplicación. Así los usuarios interactúan con nuestra app con los elementos que existen dentro de su página por su rol o por el texto que están mostrando al usuario o por la etiqueta que tienen o por el marcador Y estas son las mismas cosas que existen en la obra. Anteriormente, también hay otras herramientas que en las últimas décadas las hemos estado usando y algunas de ellas estaban usando selectores CSS Pero hay algunas ventajas de get by methods sobre los selectores CSS Aquí verás las cuatro principales ventajas y la primera es que un selector CSS no está centrado en el usuario, por lo que es más centrado en el código y cómo el desarrollador asignará las clases a los elementos y tal vez incluso una clase no esté asociada con algo visible que el usuario ve en la página. Pero los métodos Gb están centrados en el usuario, por lo que en realidad estamos probando la misma manera en que el usuario interactúa con nuestra aplicación. Y también tienen el beneficio de accesibilidad y están implementando roles de Audio y Audio significa para ricas aplicaciones de Internet. Tienen algunos atributos extra externos para los roles que tienen las personas con discapacidad que están utilizando algún tipo de asistencia para trabajar con computadoras, también pueden usarlos y sostendrán nuestra aplicación para que también sea utilizable por estas personas y también podamos probar la accesibilidad de nuestra aplicación. La tercera ventaja es que son estables a lo largo del tiempo, por lo que no son tanto frágiles como los selectores CSS Si tienes algunos selectores CSS y si intentas obtener elementos basados en las clases o estilos CSS, con los cambios mínimos en el front-end en la interfaz de usuario o refactorización, se puede romper y tus pruebas gemelas finales están fallando Pero en realidad, tal vez no hay nada malo, pero simplemente está sucediendo por las refactorizaciones Pero obtener por métodos son menos frágiles, nos ayuda a ser más estables con el tiempo. Yo también nos ayuda a tener pruebas más legibles, tal vez una clase CSS no nos diga exactamente lo que intentamos lograr a través de esta prueba. Pero estos métodos nos ayudan a tener pruebas legibles. 71. Métodos más comunes de getBy*: Y hablemos de algún uso común get by métodos. Y te voy a dar algunos ejemplos aquí y algunos de los más famosos que puedes usar dentro de tu aplicación. El primero es G por rol, que podemos pasar un rol y también podemos pasar un segundo parámetro, que es un parámetro opcional, pero también podemos especificar algunas opciones. Por ejemplo, si tenemos un botón en nuestra página y queremos obtener este botón, podemos usar el botón G por rollo. Si tienes varios botones y uno de ellos tiene un nombre específico, por ejemplo, para submit, podemos usar este nombre submit como segundo parámetro para obtener exactamente ese elemento. Obtener por rol es bueno para botón, enlaces, casilla de verificación, encabezados Como recuerdas en nuestras pruebas, también usamos el rol Geb por ejemplo, para H dos para verificar el encabezado de la página El segundo método es G por texto, y esto es exactamente lo que dice, G por texto. Es genial para verificar el contenido de texto que el usuario realmente ve en la página, para que podamos obtener los elementos basados en el texto que realmente el usuario está viendo. Y el tercer método es G por etiqueta, que es útil para entradas, área de texto y casillas de verificación, las cuales tienen una etiqueta asociada a ellas. Entonces también podemos usar esta G por etiqueta para, por ejemplo, verificar si la entrada existía y tener algún tipo de interacción con la entrada que está asociada con la etiqueta. Y el siguiente método es obtener por marcador de posición. Esto es realmente útil cuando tenemos una entrada y esta entrada no tiene una etiqueta, lo que no podemos usar G por etiqueta, pero esta entrada tiene un marcador de posición el usuario ve este marcador de lugar que dice a los usuarios qué tipo de datos deben ingresar en esta entrada También podemos usar este marcador de posición para obtener estos elementos. Y el siguiente es get by Alts text, que es una abreviatura de G por texto alternativo Y esto también es si tenemos algunos elementos que tienen este atributo alt, y lo son y también promueve la accesibilidad del HTML semántico También podemos usar texto G por Alt para obtener estos elementos. El último es G by Title, y este encontrará elementos basados en el atributo title. Entonces si tenemos, por ejemplo, la punta de herramienta y esta punta de herramienta tiene un título, y queremos obtener esa punta de herramienta y asegurarnos que muestre los textos correctos al usuario, podemos usar Get by Title.