Writing the Unit Test (Unit Testing Part 4)

Writing the Unit Test (Unit Testing Part 4)

hola a todos, mi nombre es michaela karen, soy un desarrollador de ios de tiempo completo y un trabajador independiente , comencemos a escribir una prueba unitaria en el último video, nos burlamos de nuestra solicitud de red, así que si abrimos eso y abrimos el real , nos burlamos de este cliente http, ¿y qué? en realidad lo que hace es cargar un archivo json desde el objetivo de la prueba unitaria en lugar de lo que hace el cliente http real aquí , es que va a la red real a Internet y obtiene los datos y pudimos hacer esto porque este carga el archivo json es una parte de mockable, que es un protocolo personalizado que creamos, tiene el paquete y luego el código que realmente obtiene los datos json y con el cliente http creamos nuestro cliente http de protocolo y lo que hace es en nuestro modelo de vista de lista de canciones real tomamos el protocolo en lugar de tomar el tipo concreto, por lo que esto nos permitirá en nuestra prueba cambiar el tipo concreto con nuestro tipo simulado al hacer esto, esto nos permite probar nuestro código en lugar de probar la red, así que cuando alguien posee como una conexión a Internet irregular, la descarga de datos de su red tomaría más tiempo en comparación con alguien que tiene una conexión a Internet rápida, por lo que cuando hacemos una prueba unitaria queremos eliminar eso por completo de la ecuación, así que volvamos a nuestro archivo original que dice yt prueba de la aplicación vapor ios, sí, eliminémoslo, así que haga clic en esto y haga clic en eliminar y muévase a la papelera, así que haga clic en la carpeta del grupo aquí y haga clic en el comando n para crear un nuevo archivo y para esto técnicamente podría escribir un archivo rápido o nosotros puede simplemente hacer clic específicamente en la clase de caso de prueba unitaria y qué es esto, es un archivo rápido pero configura todo para usted con anticipación, así que llamemos a este modelo tess de um songlessview y luego es una subclase del caso de prueba xc y estamos usando swift, por lo que si hacemos clic en siguiente, queremos guardarlo en el grupo de prueba de la aplicación y luego asegurarnos de que esté en el objetivo adecuado, nuestro objetivo de prueba y hacer clic en crear y cuando hicimos clic como un caso de prueba de unidad en lugar de simplemente hacer un archivo rápido porque eso es ejemplo En realidad, lo que esto es, um, todo lo que está haciendo es simplemente darnos todo este modelo estándar , por lo que en realidad vamos a eliminarlo todo, por lo que tal vez podríamos haber creado un archivo rápido, pero está bien y verás a la izquierda que dice r eso es porque esto El proyecto está bajo control de código fuente y, por lo tanto, cree que eliminamos ese archivo y luego lo volvimos a agregar y piensa que simplemente cambiamos el nombre del archivo, por lo que es como eliminarlo, pero eso realmente no importa, así que lo que queremos hacer es crear un método de configuración y los métodos de desmontaje, así que escribamos configuración y, a veces, cuando presiona Intro inmediatamente, tiene esta función de clase que no es la que queremos, queremos la función de configuración normal que se vería así, pero si comienza a escribir configure nuevamente, puede ver la diferencia entre los dos, el de arriba dice estado inicial antes de que comience un caso de prueba y luego el de abajo dice bla, bla, bla, llama a cada método de prueba en un caso de prueba, por lo que todo el caso de prueba es su clase pero la prueba método que es nuestro actu al igual que la prueba de unidad, así que esa es la que queremos y puede ver que no tiene esa clase de palabra delante, así que queremos hacer esto para configurar y desmontar , queremos llamar a esta superclase, por lo que super dot setup y open esa configuración uh super dot tear down y lo que queremos probar es nuestro modelo de vista de lista de canciones de vista, así que hagamos una variable para él , llamémoslo lista de canciones vm y es del tipo modelo de vista sin canciones, así que si intentamos ejecutar la prueba unitaria si hacemos clic comando u no se ejecuta porque, por un lado, no tiene un inicializador y dos, dice que el modelo de vista de gafas de sol no está en el alcance, así que lo que tenemos que hacer es que este objetivo de prueba es un grupo de significado de objetivo completamente diferente del alcance de nuestra aplicación, así que colapsamos que este es nuestro objetivo de prueba y luego este es nuestro objetivo de aplicación y no les gusta hablar entre ellos sin que usted lo diga, así que lo que tenemos que hacer es importar el código de objetivos de nuestra aplicación, entonces lo hacemos con una importación comprobable yt vapor ios app y este será típicamente el nombre de su proyecto y esto dice no tiene inicializador, por lo que lo que realmente queremos hacer es forzarlo a desenvolverlo y luego eso debería ser bueno, así que lo que vamos a hacer en esta configuración es configurarlo en un valor porque en este momento sabemos el tipo pero no es así. todavía tiene un valor, así que queremos hacer que la lista de canciones vm sea igual al modelo de vista de la lista de canciones y podemos ver que toma un tipo de protocolo de cliente http y luego sabe que la variable se llama cliente http, entonces lo que queremos darle es nuestro simulacro en lugar de darle el reclamo http real o cómo llamamos a este cliente http simulado y aquí mismo estamos configurando el simulacro, estamos dando el simulacro a nuestro modelo de vista en lugar de usar el cliente http real aquí doo doo doo adónde fue como lo hace aquí es donde podemos pasar cualquiera que queramos, el simulacro o el real , así que queremos hacer eso y luego en el desmontaje queremos hacer no esa lista de canciones vm y simplemente configúrelo igual a cero porque con la configuración y el desmontaje esto nos permite crear nuestra prueba unitaria para tener los mismos parámetros cuando comienzan cada prueba y cuando terminan cada prueba o no, lo siento cuando comienzan cada nueva prueba, por lo que la configuración se ejecuta antes de cada prueba y luego se ejecuta el desmontaje después, por lo que es como restablecer nuestro estado y lo que queremos hacer es vamos a hacer Funk prueba buscar canciones con éxito y cuando hacemos esto podemos continuar y hacer clic en el diamante para ejecutar toda la clase o simplemente ejecutar esta prueba de unidad y la ejecutamos, crea nuestra aplicación y dice que la prueba tuvo éxito, lo cual es bueno porque nuestra prueba de unidad o lo siento, nuestra aplicación, sí, objetivo de prueba de la aplicación, lo siento, el objetivo de prueba se está ejecutando y no tiene ningún error de compilación, pero esto realmente no está haciendo nada porque no estamos afirmando nada en esta función real, así que lo que queremos hacer es queremos probar cuando buscamos canciones y asegurarnos de que buscamos y recibimos la cantidad adecuada de canciones, de modo que cuando miramos nuestra respuesta de canción simulada tenemos dos canciones diferentes, por lo que queremos asegurarnos de que dos canciones se obtengan correctamente, así que si lo intentamos o sí tenemos que probar primero intentar oh espera canción ssvm punto buscar canciones um espero que funcione oh se lanzan errores porque podemos envolver esto en un do catch o cambiar nuestro uh cambiar la función la función de prueba de unidad real para decir que arroja entonces esto debería desaparecer allí vamos y luego, por último, queremos afirmar, por lo que queremos afirmar xct , hagamos afirmar xct igual y queremos afirmar que las canciones en nuestro modelo de vista, estas canciones son iguales a lo que se obtuvo de aquí porque podemos ver que hace una URL. seguro de que es un objeto de URL de esa cadena, hacemos la búsqueda, que será nuestro mach1, por lo que realmente irá y buscará el archivo json cargado, configúrelo en la respuesta de la canción y luego aquí estamos configurando la respuesta de la canción igual a esta variable canciones aquí entonces queremos hacer songlistvm.songs.count porque es una matriz igual a 2. Entonces deberíamos poder hacer eso y nuestra prueba debería pasar pero no es así, ¿por qué esto no funcionó de la manera en que debería ? dice que cero no es igual a dos entonces este es el que es volviendo a cero, pero de acuerdo con nuestro simulacro , deberíamos devolver nuestra respuesta json cargada, que aquí mismo hay dos valores, así que luché con esto durante mucho tiempo y descubrí que la razón es porque en nuestro modelo de vista sin canciones, esta es una variable publicada por lo que actúa un poco diferente en comparación con si fuera solo una variable normal, por lo que tenemos que escribir nuestra prueba unitaria para dar cuenta de eso, ¿a dónde vamos aquí? Entonces, lo que realmente queremos hacer es usar lo que se llama expectativas para que necesito hacer let expectation sí es igual a o cuál es xct test por qué no lo encuentro allí vamos se llama xc test expectation um y luego la descripción es um llamémoslo simplemente canciones así que lo que es una expectativa es básicamente tenemos que esperar a que suceda algo, así que pensamos en ello como si esperáramos que sucediera algo, pero no sabemos cuándo sucederá, así que tenemos que decirle al código cuándo sucederá, así que con la expectativa de que es definir cuál es la expectativa tation y se llama canciones, podríamos llamarlo como publicado o buscar canciones y luego dentro de nuestro código aquí estamos llamando a buscar canciones para que esté haciendo la búsqueda y usando nuestra variable simulada pero tenemos que decirle a xcode cómo cuándo esperamos esto para terminar, pensé que con el intento en espera simplemente funcionaría, pero eso no funcionó para mí debido a que esta variable publicada es lo que encontré, pero si hay una forma diferente de hacer esto que conozcas, házmelo saber en los comentarios o etiquetarme en instagram o twitter o etiquetar el código con chris me encantaría saber si hay una manera diferente de hacer esto pero esta es la que encontré que ha funcionado así que con esto queremos hacer una lista de canciones vm y estamos vamos a usar combine, por lo que necesitamos importar combine en la parte superior, por lo que esto usa combine y para cualquiera que no sepa, este es un tutorial como ray wonder, pero combine se anunció en wwdc y es un marco reactivo, por lo que es como usted Puedo ver que es para manejar eventos, sí, sería lo mejor. forma de decir esto maneja um editor y suscriptor por lo que maneja cuando suceden cosas y quién debería estar escuchando esas cosas que están sucediendo es una especie de esencia de cómo funciona todo esto así que eso es lo que tenemos que saber aquí mismo están obteniendo nuestras canciones y los datos van a nuestra variable de canciones que es una variable publicada, por lo que necesitamos saber cuándo se publicaron esos datos, por lo que debemos suscribirnos , lo que significa escuchar para que eso suceda, así que para hacerlo estamos usando songlessvm y luego dot songs es la variable publicada que estamos escuchando y luego aquí tenemos drop first pondré un enlace para la publicación de um que encontré que me dio todo este código que hizo que todo finalmente funcionara estoy no estoy 100 seguro de por qué estamos usando soltar primero esto cuando miras la definición dice que omite un número específico de elementos y luego aquí abajo dice que el valor predeterminado es uno, así que está cayendo la primera vez que se le asigna un valor, así que quiero decir que será cuando el modelo de vista sin canciones se crea al principio, se asigna el valor y es una matriz vacía, así que quiero decir que eso es lo que cae primero, pero no estoy 100 seguro y luego la sincronización es en realidad si hacemos clic en el comando, haga clic en esto y luego haga clic en mostrar ayuda rápida. dice que se adjunta como suscriptor con un comportamiento basado en el cierre a un editor que nunca falla, por lo que esto significa y puede ver en el ejemplo si tenemos 0 a 3 y tenemos un editor y luego escribimos sincronizar podemos ver qué sucede de 0 a 3 cada vez que cambia el valor de esta variable, entonces eso es lo que estamos escuchando cuando este valor cambia y el valor debería cambiar aquí porque en buscar canciones si vamos a nuestro simulacro porque ese es el que se está llamando somos cargando el json, pero si observamos el modelo de vista real, aquí está la búsqueda, por lo que está cargando json y estamos configurando la respuesta de la canción, que es solo una variable, pero aquí la respuesta de la canción es igual a self.songs, así que eso es lo que estamos escuchando. a y luego esto es lo que es ese valor y lo que w Lo que queremos hacer es hacer xct afirmar igual y queremos afirmar que value.count es igual a 2. Entonces queremos afirmar value.count porque el valor es lo que sea que esté aquí, que es la matriz de la canción, así que piense en value como la matriz de canciones y luego es una matriz, por lo que tiene una propiedad llamada conteo y eso es lo que en realidad estamos verificando y luego tenemos que escribir expectativa de cumplimiento, por lo que esto significa en este punto nuestra expectativa oh um nuestra expectativa es esto es que esperamos algo que suceda en algún momento aquí vamos y hacemos algo vamos a este código finalmente y luego podemos decir hey nuestra expectativa sucedió como lo que estábamos esperando finalmente sucedió así que aquí también tenemos esperar la expectativa porque es el código puede pasar por aquí y pasar por esto, esto es un cierre, pero luego tenemos que decir, oye, espera a que suceda algo y este no es el correcto, queremos a cuál estoy escribiendo, quiero escribir , este es peso, está bien, esto es el que queremos usar es esperar f o expectativa, por lo que estamos esperando la expectativa, por lo que esta es una serie de expectativas, por lo que podría tener varias de ellas y luego el tiempo de espera es después de que haya pasado un segundo, esto fallaría automáticamente y la prueba unitaria fallaría y luego la última parte de esta parte con la observación es que tenemos que ponerlo en llamémoslo cancelable, por lo que debe ser un conjunto de cualquier cancelable y lo necesitamos en nuestra prueba unitaria o en nuestra clase de prueba unitaria, por lo que queremos forzar el desenvolvimiento. no tenemos ese error con los no inicializadores y aquí abajo pasaremos los cancelables, así que si ordenamos hacer clic en esto para ver más al respecto, dice un conjunto para almacenar cualquier cancelable y si hace clic en esto , aparecerán los documentos y le dirán eres un objeto incantable que ejecuta un cierre proporcionado cuando se cancela , tenemos este objeto cancelable y, sinceramente, no sé cómo funciona exactamente . No he hecho demasiado con combine, pero cuando tenemos esta sincronización aquí, dice um , devuelve un cancelar cancelable en ins tance que puede usar para finalizar la asignación del valor recibido um y la desasignación del resultado derribará el flujo de suscripción y luego esto es lo que usamos para eso para que pueda buscar y leer más sobre qué es cancelable este tipo pero pueden ver que todo es parte de la combinación que tiene que ver con publicar y suscribir variables y reaccionar , así que una vez que escribimos todo esto, deberíamos estar bien, así que pueden ver que esto es de nuestra prueba de unidad de campo cuando dice que 0 no es igual a 2, pero ahora, cómo funciona es que tenemos una expectativa, lo que significa que esperamos que suceda algo, pero simplemente no sabemos cuándo vamos a intentar buscar canciones y esto se obtiene de nuestro archivo json local, ejecutamos esta parte que es observando esos cambios en la variable de canciones en nuestra lista de canciones modelo de vista de lista de canciones, que es una variable publicada y luego, una vez que tenemos un valor, podemos afirmar que es igual a dos, por lo que podemos eliminarlo de aquí abajo, podríamos ponerlo en cualquier lado dentro de este cl seguro o no , pero he leído que es posible que todo esto se ejecute antes o lo siento después de que esta declaración hubiera sucedido, por lo que técnicamente aún puede haber mostrado 0 y 2. en realidad, cuando eso puede no haber sido cierto, solo depende de lo que sea corrió primero, por lo que dice que la mejor manera sería mantenerlo dentro de este cierre, así que lo borraremos, pero luego, aquí en la parte inferior, estamos esperando que suceda nuestra expectativa aquí hasta que sepamos que hay un valor y sabemos que dentro de este sumidero y luego es cuando podemos escribir el cumplimiento del punto de expectativa, lo que significa que nuestra expectativa se cumplió, lo que pensamos que sucedería sucedió, así que ahora estamos bien y cuando vamos y ejecutamos la prueba unitaria vemos que la compilación tuvo éxito y eso falló ¿por qué falló esto? oh, ya veo, así que esto falló porque inesperadamente desenvolvimos nil y la razón de esto es porque nunca establecimos un valor para esto, así que esto es un conjunto, así que escribimos cancelaciones es igual a vacío, es una matriz vacía pero creo conjuntos y matriz Usamos la misma sintaxis, así que todo lo que necesitamos es cancelables es igual a una matriz vacía y probablemente podríamos poner eso dentro de nuestro desmontaje también, está bien, ahora deberíamos ejecutar esto y debería pasar y ahí vamos vemos este pop -up la prueba tuvo éxito y nuestra prueba pasó , por lo que tomó mucho trabajo simular la solicitud de red y escribir la prueba unitaria, pero ahora hemos demostrado que podemos obtener, podemos obtener datos de json y podemos manejarlo correctamente en nuestra aplicación, así que lo que hemos hecho es probar una sola cosa, pero si quisiéramos saber cuánto de nuestro código base realmente hemos cubierto en las pruebas , usamos algo llamado cobertura de código, así que si sube aquí y yo estoy en xcode 13.2.1 en este momento , así que esto está aquí en lugar de que solía estar aquí para xcode, creo que 12. um, hacemos clic en esto y hacemos clic en editar esquema y lo que queremos hacer es bajar para probar normalmente está en ejecución, así que cámbielo a prueba y queremos marcar esta casilla que dice recopilar código cove rabia y queremos hacerlo solo para algunos objetivos y hacemos clic en el signo más y en este momento solo tenemos nuestro objetivo de aplicación real, así que eso es lo que queremos probar en lugar de si tuviera otras bibliotecas de terceros, es posible que aparezcan aquí también y no quiere probar esos, solo quiere probar su propio código, así que si seguimos adelante y hacemos clic en agregar, se indica aquí y hacemos clic en cerrar para averiguar qué es eso, hacemos clic en el comando u y que ejecuta todas las pruebas, por lo que si tuviera pruebas unitarias y pruebas de interfaz de usuario, ejecutaría todo y eso es lo que desea recopilar todo lo que se denomina cobertura de código, por lo que queremos saber qué código está cubierto por Unites y podemos verlo yendo a este navegador de aquí lejos, cómo se llama, es el navegador de informes para que pueda ver que todos estos son de como construir el proyecto una y otra y otra vez y el registro de la construcción para que muestre que le gusta lo que sea que usted pero queremos revisar este que dice cobertura cuando miramos en esto, podemos expandir esto y podemos ver que solo 37.6 de nuestro código está cubierto, pero cuando hacemos clic en él y lo expandimos un poco más, podemos profundizar más y ver cuánto de cada archivo está cubierto para que podamos ver el vapor de yt el archivo de la aplicación ios que está 100 cubierto y luego nuestro cliente http um real, podemos hacer clic en esto y hacer clic en esta pequeña flecha y nos muestra lo que sea que nuestro código esté cubierto o no por esta pequeña cosa a la izquierda y si no tiene esto haga clic en esta cosita de línea y luego asegúrese de tener la cobertura de código seleccionada, por lo que la mía generalmente también tiene el minimapa abierto . también vea la parte de cobertura del código que le dirá, um, esta parte del código está cubierta, lo que significa literalmente como llamar a la función, pero esta parte no está cubierta de la prueba de que obtuvimos una respuesta de 200 y puede ver individualmente línea por línea lo que es y no está cubierto por una prueba de unidad si nos gusta nuestro modelo de vista de lista de canciones vemos que la mayor parte está cubierta y luego nuestras canciones de búsqueda cubrimos todo excepto lo real si la url no es un objeto de url el código puede salir en este punto, lo que significa que puede lanzar y luego la función terminaría no lo hicimos prueba esa ruta, pero probamos el resto , por eso, debajo de sunglass vm, podemos ver debajo de buscar canciones que están cubiertas en un 84.6 por ciento y así es como puedes verificar la cobertura de tu código y, como dije durante el video introductorio , depende de qué tipo de cobertura de código que su empresa puede tener o que usted personalmente desea, pero en general debe optar por la calidad de las pruebas sobre un número específico o un porcentaje específico porque varía, es genial si escribe un montón de pruebas unitarias pero si las pruebas unitarias no son realmente útil, entonces la cobertura de su código no importa al final , así que asegúrese de tener calidad sobre la cantidad de pruebas unitarias en este video, escribimos una prueba unitaria que usó una solicitud de red simulada para que pudiéramos aislar nuestras pruebas unitarias y solo probar nuestro código en lugar de probar también la red o probar Internet y también habilitamos la cobertura de código para nuestro proyecto

Noticias relacionadas