Desarrollo impulsado por pruebas con . NET Core | Trevoir Williams | Skillshare
Buscar

Velocidad de reproducción


1.0x


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

Desarrollo impulsado por pruebas con . NET Core

teacher avatar Trevoir Williams, Jamaican Software Engineer

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

      5:14

    • 2.

      Crear proyecto de prueba

      7:25

    • 3.

      Prueba de unidad: crea una prueba de unidad según los requisitos

      15:40

    • 4.

      Implementación: escritura de código para devolver datos correctos

      3:31

    • 5.

      Refactor: código de prueba e implementación

      7:04

    • 6.

      Revisa la lista de requisitos completa con proyectos de GitHub

      5:56

    • 7.

      Prueba e implementación: lanza una excepción cuando la solicitud es nula

      7:52

    • 8.

      Crea servicios de reservas

      4:05

    • 9.

      Prueba de unidad: guarda una reserva de habitación

      12:50

    • 10.

      Implementación: guarda una reserva de habitación

      8:52

    • 11.

      Prueba de unidad: verifica si hay habitaciones disponibles

      6:34

    • 12.

      Implemento: verifica si hay habitación disponible

      6:25

    • 13.

      Prueba e implementación: agrega un ID de habitación al resultado

      5:22

    • 14.

      Prueba e implementación: devuelve un resultado de reserva exitoso o fallido

      9:32

    • 15.

      Prueba e implementación: agrega un ID de reserva al resultado

      6:27

    • 16.

      Revisión de sección

      1:35

    • 17.

      Proyecto de refactorización para la capa de acceso a datos

      11:02

    • 18.

      Prueba de unidades: recupera habitaciones disponibles

      13:50

    • 19.

      Implementación: recupera habitaciones disponibles

      9:31

    • 20.

      Prueba e implementación: guarda una reserva de habitación

      7:45

    • 21.

      Revisión de sección

      3:18

    • 22.

      Cómo entender las pruebas de unidades. Aplicaciones centrales de NET

      10:27

    • 23.

      Configuración del almacén de datos en memoria de Sqlite

      4:08

    • 24.

      Crear escenarios de prueba de unidades

      11:32

    • 25.

      Implementación de código para las pruebas

      16:32

    • 26.

      Ejecución y prueba de la aplicación básica ASP.NET

      9:14

    • 27.

      Revisión del curso

      4:06

  • --
  • 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.

73

Estudiantes

--

Proyecto

Acerca de esta clase

El desarrollo basado en pruebas (TDD) es un enfoque poderoso para construir software sólido y robusto. En este curso, aprenderás las habilidades necesarias para aplicar TDD en tu computadora. Proyectos NET. Las pruebas de unidades son un tipo de pruebas de software en el que se escribe código para automatizar las pruebas de las subsecciones de una aplicación completa. Esta metodología ofrece una cobertura más funcional y reduce la necesidad de pruebas de regresión manual cuando cambia el código de la aplicación. El propósito es validar que cada unidad del código de software funcione como se espera.

Descubrirás los conceptos básicos de las pruebas de unidades y sobre el ciclo de refactor de rojo y verde. También aprenderás a probar e implementar la lógica de negocios en un entorno de aprendizaje interactivo. Aplicación NET Core que usa xUnit como marco de pruebas y Moq como biblioteca de burlas.

Después de este curso, tendrás conocimientos básicos sobre el desarrollo basado en pruebas que te ayudarán a probar e implementar nuevas características en tus proyectos de C#. Tendrás las habilidades y los conocimientos necesarios para crear una aplicación ASP.NET Core comprobable y mantenible, necesaria para diseñar una empresa del mundo real. Aplicaciones NET Core.

Construye una base sólida en las pruebas de unidades en . RED:

  • Usar proyectos de prueba de xUnit

  • Usa Moq y Shouldly para escribir pruebas unitarias

  • Proyectos de GitHub para hacer un seguimiento de los requisitos
  • Desarrollo basado en pruebas de Refactor (TDD) en rojo, verde

  • Practica el desarrollo basado en pruebas en código real

  • Aprenderás a escribir código verificable

  • Comprenderás cómo escribir pruebas unitarias y luego crear o refactorizar código

  • Revisa los problemas que debes evitar y los desafíos más comunes

El curso se completa con archivos que funcionan alojados en GitHub, y se incluyen algunos archivos para que te sea más fácil replicar el código que se está demostrando

Conoce a tu profesor(a)

Teacher Profile Image

Trevoir Williams

Jamaican Software Engineer

Profesor(a)

Habilidades relacionadas

Desarrollo Desarrollo web
Level: All Levels

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: Bienvenido al desarrollo impulsado por pruebas en dotnet Core, el manual. Soy tu instructor de viaje o Williams y soy ingeniero de software y literatura desde hace más de una década. Ahora probablemente tengas curiosidad por ver el título del curso y te preguntas ¿qué es exactamente el desarrollo impulsado por pruebas? Bueno, el desarrollo impulsado por pruebas es un proceso de desarrollo de software que se basa en que los requisitos se escriban como casos de prueba antes de que se escriba código real. Entonces eso es correcto, ¿lo has leído bien? Hacemos las pruebas unitarias. En primer lugar. Sé que la prueba de palabras es lo que te llevó a este curso. Y estás mirando la prueba de palabras, me pregunto, vale, sé un poco de qué son las pruebas unitarias, pero no necesariamente estoy seguro de cómo puedo usarlas en mi código. Bueno, este es el curso perfecto para ti. Por lo que TDD es un proceso de asegurar que escribimos código comprobable y es lo suficientemente modular y simplemente basta para hacer la tarea. También es un proceso que asegura que contamos con la máxima cobertura de código. Entonces cuando hagamos cambios de ruptura y más adelante en el código, no necesariamente habrá ruptura, pero encajarán bien. Ahora tenemos lo que llamamos el ciclo de desarrollo impulsado por pruebas. En este ciclo, hacemos nuestra prueba roja, que significa que escribimos la prueba unitaria. No hay código, ni código de soporte, pero como modelamos en la prueba, tenemos que crear todos los artefactos que se necesitarían en el código real de todos modos. Por lo que esto nos ayuda con nuestra API inicial o conceptos de diseño de código inicial. Entonces escribimos el código demasiado las pruebas que hemos escrito. Por lo que escribimos una prueba para igualar el requisito en ninguna parte escribiendo el código para que coincida con la prueba. Y entonces el resultado final de esto sería que escribimos el código para que coincida con la prueba y volvemos a probar y obtener una prueba verde. Por lo que la prueba roja significa que falla. No hay código que apoye esta prueba. Escribimos el código y luego volvemos a probar, y esta prueba ahora debe pasar. Entonces eso significa que el código que hemos escrito ahora va a cumplir con el requisito para el que se redactó la prueba. Por lo que a medida que hacemos esto y o crecen los requisitos mejora nuestra comprensión de lo que se necesita implementar. Refactoramos y repetimos este proceso. Ahora, muchos desarrolladores prueba unitaria Nobel, pero no muchos desarrolladores realmente lo practican. Religiosos, lo practican en la medida en que lo necesiten. 1, te dice que escribas código comprobable. Siempre vas a ser imaginable escribiendo tu código de una manera que pueda probar diferentes aspectos del mismo sin tener que preocuparte por inicializar o burlarte de demasiadas cosas a la vez. Pero todas las cosas son inyectables. Por lo que ayuda a hacer cumplir lo que llamamos los principios sólidos desde el principio. Por lo general conduce a un código mucho más limpio y sucinto y por lo general implica poner en prácticas adecuadas a la hora de escribir su código. Además, obtienes retroalimentación casi instantánea sobre si tu código funciona o no porque solo vas a hacer una prueba automatizada contra un caso de prueba. Por lo que se crea un escenario en el que debe pasar su prueba, probablemente uno en el que si los datos estaban, pero debería hacer esto. Simplemente crea tus escenarios y obtienes retroalimentación instantánea. Los ciudadanos tienen que esperar cuanto tiempo para que una solicitud se apague. Y luego pones los valores y luego ves la retroalimentación. Puedes automatizar estas cosas y reducirá en gran medida la cantidad de tiempo que dediques a probar y volver a probar código. Ahora con todo eso dicho, hay desventajas y algunas de ellas incluyen el hecho de que consume mucho tiempo porque en realidad estás escribiendo el doble de código que probablemente tendrías si solo estuvieras escribiendo el código desde el principio. También podría ser difícil para los principiantes obtener el inicialmente, pero hey, por eso estamos todos aquí en este momento este curso es muy amigable para principiantes. Aprendes a usar la unidad ECC para hacer que los proyectos de pruebas aguanten para usar bibliotecas de terceros para hacer que las pruebas y aserciones sean mucho más fáciles. Veremos cómo hacemos todo el ciclo de prueba. Entonces escribiremos pruebas luego implementaremos el código, y luego somos factor a medida que la aplicación crece y miramos solo el desarrollo impulsado por pruebas y lanzamos este curso, revisaremos algunos de los trampas, pero en última instancia queremos para simplemente aumentar tus habilidades de pruebas unitarias y ayudarte a tener una apreciación de por qué es importante y cómo se puede hacer con la máxima eficiencia. Ahora un rápido avance de lo que estaremos haciendo. Una, vamos a estar construyendo una aplicación real. No va a ser la aplicación más complicada, pero va a ser justo que podamos ver cómo pueden funcionar los diferentes niveles de pruebas unitarias, cómo evoluciona con el tiempo, y algunos de los niveles básicos o altos requisitos artefacto, ese, Es una aplicación de reserva de habitación. Entonces tengo que poner en lógica para gobernar. Se reserva toda la habitación, lo que se solicita, qué tipo de retroalimentación va a dar la solicitud. Y eventualmente nos vamos a enganchar a una base de datos. Por lo que necesitamos asegurarnos de que todas esas conexiones funcionen. Entonces les digo que al final de este curso, habríamos construido algo cercano a cómo sería nuestra aplicación empresarial real. Y lo habríamos hecho usando el desarrollo impulsado por pruebas. Entonces con todo lo dicho y hecho, se trata de un desarrollo impulsado por pruebas con dotnet Core, el manual. Y no puedo esperar a verte en el curso. 2. Crea un proyecto de prueba: Muy bien chicos, Así que sigamos en este curso y vamos a empezar montando proyectos de artistas. Entonces si aún no tienes Visual Studio, él puede seguir adelante y conseguir 2019 son la última versión disponible para ti al momento de esta grabación. Pero lo que vamos a hacer es seguir adelante y crear un nuevo proyecto. Y queremos una x unidad prueba proyectos o simplemente es una búsqueda de x unidades. Ahora, solo tenga en cuenta que sí, estamos usando x unidad para este curso. Pero los principios generales de las pruebas unitarias se pueden aplicar a un proyecto de unidad final o incluso a un proyecto de prueba regular de Microsoft. Porque si solo escribes en prueba o un proyecto de prueba, estoy seguro que verás MSTest. Ahí vamos. Y proyecto de prueba unitaria así como los proyectos de prueba de unidad X. Entonces te estaré mostrando usando x unidades, pero los principios generales de las pruebas unitarias seguirán siendo ciertos. Entonces sigamos adelante y golpeemos a las unidades H. Y vamos a estar llamando a esta sala de proyecto reserva hasta punto core, punto. Por lo que habitación aumento de volumen nombre de la aplicación. Core va a estar donde tengamos toda la lógica empresarial. Entonces solo lo estoy llamando punto core, pero luego estaremos escribiendo pruebas unitarias alrededor del proyecto central. Para el nombre de la solución. Vamos a renombrar eso. Entonces solo voy a decir reserva de habitación, eso está en solución, pero en este momento sólo estamos lidiando con un proyecto de prueba. Entonces otra vez, adelante y crea esos, hit Next. Y sí, estamos usando dotnet cinco veces de esta grabación. Si hay una versión poco y siéntete libre de usarla, lo cual probablemente se haría a las seis. Y luego vamos adelante y pegamos a Crear. Por lo que el resultado final de esa actividad es nuestro conseguir este nuevo proyecto room booking dot core dot tests. También obtenemos ese archivo por defecto llamado unittest uno. Ahora me gusta escribir una prueba unitaria en este video en particular, pero vamos a caminar a través de ciertas configuraciones que la cosa simplemente nos hará más fácil avanzar. También miraré los fundamentos de lo que es una prueba unitaria. Entonces lo primero que voy a hacer es hacer clic derecho en nuestro archivo de proyecto para el proyecto de prueba e ir a Propiedades. Y lo que voy a hacer es cambiar el espacio de nombres predeterminado. A veces mi Visual Studio superficie glitchy del conmutador 15 pestañas. Pero vamos a cambiar el espacio de nombres predeterminado a Booking dot core, alguien que elimine eso porque lo que sucede es que en realidad hace más fácil compartir recursos entre los proyectos, el proyecto de prueba y el núcleo de puntos real proyecto cuando se pone en línea. Y si tienen el mismo espacio de nombres, entonces es fácil compartir los recursos que definitivamente necesitarán ser compartidos entre los dos. Entonces solo estoy asegurándome de que todo esté bien con eso y luego puedo guardar y cerrar eso. Ahora, sí dije configuraciones, pero esa es realmente la única que necesitamos al menos, ¿verdad? No. Entonces en cuanto a los fundamentos de una prueba unitaria, se nota que una, tenemos esta anotación por encima del método llamado grasa. Ahora esto es lo que le dice al IDE, el programa todo lo que esto es solo una prueba unitaria, factorice esto en todo el tiempo de ejecución de la aplicación. Es una prueba unitaria. Entonces en cualquier momento que estemos escribiendo pruebas unitarias, vamos a querer al menos tener esta anotación que dice gorda. Y otra anotación que vamos a estar viendo es la teoría. Pero llegaremos allí eventualmente. Entonces ese es el paso número uno. El siguiente punto a tener en cuenta es que una prueba unitaria suele tener tres pasos para ello. Tienes la naranja, nosotros tenemos el corazón, y después tenemos aseveración. Por lo que en términos generales, las Iranges donde preparas todos los datos, preparas tus artefactos de prueba. Ya sabes, cada vez que vas a estar probando algo usando una interfaz de usuario, generalmente conoce un valor que necesitas poner para obtener qué tipo de respuesta para cualquier resultado que estés probando. Entonces eso es lo que están dispuestos porción es hacia adelante cuando crear objetos son representaciones de cualquier dato con el que esperaríamos estar probando. Entonces eso es lo que hacemos, los creamos. Entonces vamos a optimizar en cualquier lugar cuando para realmente simular una llamada al método que esperamos se llame cuando promulguemos tal acción, entonces nuestras aseveraciones nulas serían lo que ver si la prueba pasará o fallará. Porque entonces tendremos que afirmar que esta es la columna antigua con esta entrada a este método. ¿ O sucedió? ¿ No sucedió? Entonces si dijimos que esto debía suceder y no sucedió, esa prueba básicamente se sentirá. Y entonces ahí es cuando tendremos que o bien escribir el código para hacerlo verde o se sentiría que son el papel de la cancha y corrió la prueba. Eso significa que probablemente haya algo mal con el código o algo mal en el camino. Entonces así es básicamente como funciona una prueba unitaria. Esa es sólo la teoría. Y no estoy tratando de mantenerlo lo más simple posible para que no pienses que es demasiado duro o demasiado difícil conceptualizar cómo va a funcionar esta cosa. Bueno, Visual Studio hace que sea muy fácil navegar por las pruebas porque nos dan un Explorador de Test. Y puedes llegar a este texto Explorador de pruebas yendo a Ver y luego haciendo clic en Explorador de pruebas o haciendo Control E y T. Así que este Explorador de pruebas básicamente solo va a ser una interfaz que nos muestra todas las pruebas unitarias que están pendientes todas las pruebas, proyecta una, todas las pruebas unitarias en su lugar proyectos AC tenemos prueba unitaria 1, esa es nuestra clase I ahí dentro tenemos test1, ¿verdad? Y entonces nos permitiría hacer estas pruebas. Ahora acabo de hacer clic en Ejecutar, pero no pasa nada porque no hay nada que correr. Entonces, esencialmente cada vez que escribimos pruebas unitarias son propiedad de un método en particular, en realidad verías las propiedades de navegación que vienen dentro de Visual Studio para mostrar qué método tiene cuántas pruebas, cuántas pruebas están fallando o ideas pasantes, este método único, etcétera. Otro de los beneficios de la cuadrícula de las pruebas unitarias en su cotización es que puede configurar lo que llamamos construcciones cerradas en ciertos ductos de DevOps. Por lo que DevOps canaliza cuando querías el desarrollo continuo, la integración continua, estás trabajando en un equipo, diferentes personas engañaron en diferentes partes del código. Se quiere asegurar que cuando alguien comprueba en su código que todas las pruebas unitarias que utilizan el trabajo sigan funcionando. Y cualesquiera nuevas, introdujeron nuestra política, lamento que pasen no funcionan. Cómo dicen los biólogos que quería asegurarme de que todas las pruebas estén pasando antes de permitir que ese nuevo código entre en un repositorio central para todo el equipo. Por lo que las pruebas unitarias pueden actuar como guardia contra eso. Entonces con todo eso dicho y hecho, una vez más, sólo un poco de teoría, sólo un poco de comprensión de por qué estaríamos escribiendo pruebas unitarias. Y cuando regresemos, vamos a leer nuestra primera prueba para nuestro primer requisito. 3. Prueba de unidades: crea pruebas de unidades según el requisito: Muy bien chicos, así que sigamos adelante y creemos nuestra primera prueba unitaria. Nuestro primer requisito es que cuando se llama a un método en particular para procesar la reserva, esperamos un cierto tipo de resultados con todos los detalles de la reserva incluidos. Entonces ese es nuestro primer requisito que vamos a cumplir. Ahora, por supuesto, a medida que obtenemos una mejor comprensión de otros requisitos son cotizar, bloques de unquote evolucionarán. Entonces solo lo estoy haciendo en un minuto. Bloques para que podamos ver cómo evoluciona el código, cómo refactoramos hall, reprobamos y todo lo que repetimos, y básicamente cómo funciona el ciclo. Entonces con todo eso dicho y hecho lo suficiente de mi monólogo, empecemos. Entonces voy a eliminar la prueba unitaria que estamos viendo actualmente y vamos a crear una nueva clase. Y fui a llamar a esta prueba de procesador de solicitud de reserva de una habitación para descriptiva, o no hay nada de malo en ser descriptivo con sus nombres de clase. Cualquiera que mire a tu clase debe saber lo que está pasando. Por lo que esta es una prueba para nuestras solicitudes de reserva de habitaciones, el procesador que pretendemos construir eventualmente. Entonces voy a seguir adelante y añadir eso, conocer al público de la clase. Y luego dentro de esto, voy a tener vacío público. En caso de devolver habitación reservando una solicitud. Y es un método, por supuesto, no, quería hacer una pausa aquí y 0 que hay diferentes convenciones al nombrar a algunas personas, usan los guiones bajos. Algunos DB2 no usan guiones bajos. Prefieren tenerlo todo CamelCase o Pascal caso más bien. Por lo que hay diferentes convenciones. Algo de ébola, ¿verdad? Uno para pasar, otro para fallar, y tienes diferentes formas de acercarte a él. Entonces solo estoy señalando, voy a tratar de usar los guiones bajos para lo que hace. Me gustaron los guiones bajos en set de pruebas o realmente que usándolos en cualquier otro lugar. A mí me gusta usarlos al nombrar mis métodos de prueba. Es posible que no, pero el punto es que haces lo que sea cómodo contigo siempre y cuando tu código sea legible. ¿ Está bien? Entonces dentro de esta prueba, y una vez más es una prueba por lo que tenemos que asegurarnos de que le damos nuestros atributos, que es Fox punto de control, para incluir el espacio de nombres faltante para la unidad x. Ahí vamos. Entonces eso podría ser otra cosa, esa anotación podría ser otra cosa si estás usando un proyecto de prueba diferente. Pero una vez más, me estoy centrando en x unidades en este curso. Ahora lo que vamos a hacer es el Shawn naranja de toda esta amenaza de prueba, que es crear nuestros artefactos de prueba. Entonces necesito una instancia del procesador real que necesitamos probar. Entonces crearé procesador de reserva de sala var, o simplemente lo llamaría procesador, es igual a una nueva instancia de algo que aún no existe. ¿ De acuerdo? Entonces, ¿cómo hacemos que exista? Bueno, sólo voy a hacer Puntos de control. No quiero decir que genera la clase en un archivo nuevo, así que eso es todo. Adelante y crea eso para que sea nula en existencia. Puedes seguir adelante y llenarlo con todas las propiedades que sabemos que va a necesitar son los métodos que va a necesitar. Bueno, antes de que haga eso, lo que voy a hacer es RE en algún pecado y diarrea y fase Jean. Entonces, ¿por qué lm pensable los requisitos? Sé que esa es una solicitud necesita venir y dos, necesito devolver algo con los mismos valores de la solicitud que acaba de entrar. Este es el procesador que va a manejar la solicitud y hacer toda la lógica empresarial. Pero en última instancia, sé que en mi arreglo necesito Mach cómo se verán nuestras peticiones. Entonces solo voy a decir var solicitud de reserva es igual a una nueva instancia fuera y solo voy a usar solicitud de reserva de habitación. Y esto va a tener algunas propiedades. Por lo que no importa el hecho de que estas cosas no existen. Ese es un punto de desarrollo impulsado por pruebas. Modelar qué? Entonces sé que la aplicación va a necesitar completar ciertas tareas, ¿no? Por lo que la solicitud de reserva es igual a las solicitudes de reserva de habitación nuevas. Y esto va a tener o los campos nombre completo. Y sólo puedo poner en nombre de prueba. Entonces una vez más, estos son testfile es que no necesariamente tienen que darse cuenta de lo que necesitan para ser realmente suficientes para representar lo que podría entrar. Por lo que prueba request.com. Y entonces tenemos la fecha, que puedo decir es igual para poner cualquier nueva fecha, hora por donde pasamos en el año, el mes, y el día. Entonces así será como se verá esto. Este objeto es objeto de solicitud de reserva. Entonces después de hacer todo eso, puedo saber decir control dot legit, no, debería crear un nuevo archivo y mirar nuestro Visual Studio tan inteligentemente hacerlo es decir generar la clase con estas propiedades y diré por qué. Gracias. A mí me gustaría mucho que hicieras eso. Y yo sólo puedo saltar y asegurarme de que todo esté bien con eso. Y eso me parece bien. Por lo que sólo volveré a mi prueba y continentes. Por lo que tengo la clase de procesador creada, tengo la solicitud cruzada creada. No, necesito un método que realmente procese la solicitud. Estamos, pero pongamos eso hecho dentro de los procesadores. Entonces voy a poner ese procesador va a tener un método, claro que no existe. Pero se va a llamar la sala de libros, que aceptará la petición. De acuerdo, así que estoy llamando a mis métodos es R. Esto es lo que planeo llamar a los métodos. Por supuesto que podría haber llamado a este proceso solicitudes o algo más, pero sólo estoy tramando que se va a novio. Toma en nuestro objeto de solicitud. Y se supone que regresemos, ¿verdad? Deberíamos regresar. Por lo que esto ha devuelto solicitudes de habitación, solicitudes de reserva de habitaciones. Entonces voy a decir o debería devolver respuesta de reserva de habitación. Y yo solo diré qué valores son con valores de solicitudes. Creo que ya está bastante claro, Fred. Entonces cualquiera que lea eso sabrá que para esto es para lo que está probando el método. Entonces eso significa que necesito reserva de habitación, clase de resultado en otros llamados los resultados de los objetos. Y decir que es igual a cualquier habitación de libros que regresaría. Lo que significa que se supone que la sala de libros devuelva algo de este tipo, que no existe. Por supuesto, una vez más, solo Controlaré puntos y generaré este tipo en su propia clase. Está bien, así que eso está hecho. Otra cosa a tener en cuenta es que aún no tenemos este método. Por lo que este conjunto de peticiones que fue un error tipográfico de mi parte. Por lo que esto debió haber sido solicitud de reserva y reserva nula nuestra habitación de libro. Fui a controlar el punto y que generara ese método. No, puede inferir qué tipo de datos necesita ser el parámetro porque todos los fallos que estamos usando. Entonces pido disculpas por usar ahí la variable equivocada. Debió haber estado reservando solicitudes. No son sólo petición. Y quién es este es nuestro método generativo. Eso se ve bien, pero por supuesto no está implementado. Entonces revisemos lo que hemos hecho hasta ahora. Todo esto podría considerarse el rango. Por lo que hemos arreglado datos de muestra. Estamos dispuestos un objeto fuera de lo que necesitamos probar. Entonces aquí es donde en realidad llamamos al método y tratamos de obtener los resultados. Entonces eso significa que esto se llama OK. Está bien. Entonces arreglamos entonces actuamos no. Tenemos que hacer valer por lo que necesitamos asegurarnos de que nuestros supuestos son lo que esperamos que suceda es correcto. Y aunque hay construido en, hay una palabra clave incorporada para aserciones en excedido llamado assert, ¿verdad? Pero luego hay otras bibliotecas y sí vi, te mostraría una llamada en breve para que puedas hacer clic derecho, saltar a ti conseguir paquetes. Y si buscas astutamente, estaría en la parte superior de la lista donde utiliza tipo de aserción fluida tipo de herramienta de estilo, cómo puedes escribir tu código. Por lo que en realidad me gusta usarlo o simplemente adelante e instalarlo. Por supuesto, aceptando cualesquiera términos y condiciones. Y una vez hecho eso, podemos saltar de nuevo a nuestro código. Por lo que quería mostrarles ambos dice sintaxis, pero puedes tomar tu propia decisión en cuanto a si les gustó la biblioteca o no. Perdón, quiero usar el valor predeterminado, eso está bien. Por lo que puedo decir aseverar puntos. Y en este punto debe devolver la respuesta con valores. Entonces eso significa uno soy más conseguir MC, alguna respuesta o nuestro resultado, ¿verdad? Por lo que puedo ver no nulo. Afirmo que cualquiera que sea el objeto que me plazca en esto no es nulo. En este caso, quiero afirmar que el resultado NO ES nulo. Si estuviera usando un poco podría decir punto de resultado, pero entonces tendría que agregar una declaración de uso para la astucia. Entonces sólo ver el uso debería enlazar. Para que pueda mirar el objeto que es me gustaría poner la aserción y ver los resultados punto. Y puedo ver debería y mirar todos los métodos que obtienes, correcto. Por lo que debe ser nulo o no debe ser nulo. Está bien, es, puedo ver que no debe ser nulo. Esto también me permite poner mensajes personalizados para que cuando miro a hold the test run, pueda ver exactamente qué falló en base al mensaje que estoy poniendo. Entonces es bastante guay. A mí sí me gusta y es flexible. De cualquier manera. No te voy a aburrir con los tecnicismos de la librería assert versus the should. Tan solo quiero pasar por la actividad de manera adecuada. Por lo que en este punto podemos afirmar que esto no debe ser anulado, quería hacerse granular. Y al final del día o las aserciones se basan básicamente en cualquier base quieras convertir para garantizar que el código que estás probando esté efectivamente probado correctamente. Por lo que las aserciones anuales de cosas podrían ser diferentes la lista de aserciones de otra persona basadas en lo que ellos creen que es importante. Pero al final del día, espero que todo el mundo pueda ponerse de acuerdo en lo que al mínimo debe afirmarse o debe cubrirse con base en la prueba. Para que pudiéramos conseguir granuloma. Esto Esos ven con los valores de solicitud, ¿verdad? Por lo que el nombre de la prueba está explicando exactamente lo que debería suceder. Una, la respuesta no debe ser nula, está bien, por lo que no debe soportar respuesta y dos, ahí con los valores de solicitud. Entonces eso significa que lo que esté en el resultado también debe ser lo que está en la respuesta. Por lo que puedo hacer valer punto y puedo decir igual a la petición. Y luego sod este punto, las reservas o mantener un escenario misiones las solicitudes de reserva. Creo que podría necesitar simplemente cambiar el nombre de esto para solicitar. Bueno, la solicitud de reserva. Déjame hacer esas cosas cometiendo el error. Por lo que solicita este control puntos y poco, renombrar todos ellos. Ahí vamos. Por lo que solicita puntos, nombre completo. Y entonces podemos decir resultados. El resultado Hotspot no tiene ningún campo en él porque también necesita tener las tarifas CAM que tiene la solicitud. Correcto. Entonces en este punto, refactorizar y yo nos aseguramos de que sus resultados en su búsqueda. A mí me gusta, no, no me importa el hecho de que estoy repitiendo estos campos todavía. Vamos a refactorizar y por eso tienes la refactorización. En este punto. Yo solo quiero superar la prueba, asegurarme de que todo esté bien. Está bien. Por lo que quiero hacer valer que nombre completo en solicitud es igual a nombre completo en los resultados. Y yo puedo hacer eso por los demás campos. Tan solo duplicar esa línea con Control D y C, correo electrónico debe ser el mismo que el correo electrónico y debe ser el mismo que si estuvieras usando seguramente. Y yo sólo reorganizaré el código aquí, entonces dirías algo así como resultados punto y luego el campo, que debería ser nombre completo, debería ser. Por lo que debería ser. Ahí vamos. Y luego dentro de eso, pone en lo que sea el resultado esperado o resultado debe ser el mismo que solicitar consideración. Y eso es básicamente todo. Entonces dos sintaxis diferentes, dos maneras diferentes. Y al final del día, hay otras bibliotecas que puedes usar para especie de tener aserciones probablemente más legibles o más cómodas de aspecto. Eso depende de ti sin embargo. Solo te estoy mostrando tus opciones. A mí me gusta, como dije, esta es solo mi preferencia que me gusta entera. La sintaxis fluye cuando uso las aserciones debería, ¿verdad? Entonces para mí, solo puedo duplicar y luego haré lo mismo. email de punto de resultado debe ser solicitar correo electrónico de punto y solicitar punto d. debe ser eso. Entonces toma tu selección, cualquiera que prefieras. Ahora bien, si miro todo esto después de una compilación, veo que fue exitosa. Entonces no tengo errores de sintaxis ni nada. Y sé que tienen prueba ACT con clase real es nada se implementa todavía, ¿verdad? Entonces no, puedo hacer la prueba. Puedo hacer clic en este pequeño indicador aquí y puedo dar clic en Ejecutar. Entonces puedo hacer eso desde aquí, o podría lanzar mi Explorador de pruebas para ejecutar la prueba desde ahí. Bueno, es o simplemente haga clic en Ejecutar, que inicialmente lanzará estadísticas para. Y aquí vemos que tenemos una prueba fallida. Por lo que lee pruebas por el sistema de indicador.Out no implementado excepción. Entonces, en otras palabras, está tratando de llamar al método, pero no se implementa. ¿ Por qué se da esa excepción específica? Eso es porque si pasamos al método y yo solo usé si 12 para saltar por encima, entonces vemos aquí que el, tiene una prueba asociada con él y no está pasando y es a través de la excepción no implementada. De acuerdo, entonces cuando volvamos, realmente vamos a escribir aquí el código que cuando ejecutemos la prueba, deberíamos llegar al menos hasta las aseveraciones y luego podemos ver cómo se ven esas. 4. Implement: escribe código para devolver datos correctos: Oigan chicos, La última vez que estuvimos aquí, estábamos escribiendo nuestras pruebas y nula, estamos volviendo a mí en esta prueba de raíz, la codicia. Entonces así como una recapitulación, estamos escribiendo una prueba que debería devolver la respuesta de reserva de habitación con el cuerpo de solicitud es Eso es lo que es el escenario de artistas. Y hemos arreglado algunas peticiones pobres, que comprende los campos email, fullname, y solicita D it, tenemos nuestro procesador el cual aún no está implementado, o tenemos el archivo, pero la sala de libros de métodos aún no se implementa, pero tenemos ciertas aseveraciones que vimos sentir cuando ejecutamos esa prueba. También miramos las dos formas en que puedes hacer aserciones. Esta es la forma natural que sale de la caja dentro de las unidades. Y presenté una nueva biblioteca llamada en breve, que tipo de trae hasta un tipo de aserción fluida a la misma. También tienes otras bibliotecas de aserción como aserciones fluidas, y hay otras, pero como dije, escoges una y te pegas a ella si te sientes cómodo con ella. No hay problema. Entonces lo que estamos aquí para hacer es implementar nuestro método de sala de libros. Ahora la prueba, correcto, ningún requisito para el que queremos escribir código es asegurarnos de que lo que sea que se devuelva como resultado tenga todos los valores que estaban en las solicitudes. Lo que nos hace tener una implementación simple realmente. Entonces todo lo que realmente tenemos que hacer es devolver una nueva instancia del resultado de reserva de habitación donde sus campos, nombre completo sería igual a la solicitud, puntar el campo o solicitudes de reserva u otro punto el campo con el mismo nombre. Y ahora esos duplicados y luego hacen lo mismo para la fecha y lo mismo para el correo electrónico, había bajos. Entonces al final de esto, todo lo que realmente necesitamos ver es que está devolviendo algún objeto que cumpla con nuestras aseveraciones. De acuerdo, así que con eso hecho, volvamos a hacer nuestra prueba. Y voila, ahora tenemos una prueba verde. Por lo que verán aquí está indicando que una prueba fuera uno está pasando. Por lo que nuestras aseveraciones de prueba no funcionan. Entonces si fuera a comentar todas estas aseveraciones y volver a ejecutar la prueba, verías que funciona bien. Entonces si afirmas la luz esto o lo usas en breve y tipo de este estilo, funcionarán de la misma manera. Entonces eso es realmente todo lo que hay para implementar código en este punto, la etapa, al menos para tener nuestra prueba, BI green test. Entonces una vez un descanso aquí mismo, y cuando regresemos, estaremos refactorizando el código como nuestra vista previa desactivada, fuera por qué necesitamos volver y refactorizar uno. Vio usted que tenemos peticiones, entonces tenemos resultados. Ambos son un poco idénticos, ¿verdad? Esa es una herramienta. Tenemos al procesador sentado en el mismo proyecto de prueba que la prueba. Ninguno de estos recursos, que son los recursos reales para la aplicación, debería estar realmente dentro del proyecto de prueba. Entonces vamos a volver y vamos a refactorizar nuestro proyecto y alejarnos de lo que hay que mover sin embargo, si arreglamos todas las referencias y arreglamos el código para que haya menos repetición por todas partes. 5. Refactor: código de prueba y implementación: Bienvenido de nuevo. Pongamos nuestra refactorización. Entonces recuerda que el ciclo es que escribimos la prueba, es roja. Nos escribimos el código, el grado de prueba en, y luego refactoramos si es necesario, porque a veces entre las dos actividades podemos repetir código o poner archivos de trabajos donde no necesariamente debe ser nulo. En realidad vamos a reorganizar un proyecto para acarrear. Sabemos que se supone que tiene que mirar y cómo tiene que mirar hacia adelante. Muy bien, entonces lo que voy a hacer es crear otra biblioteca de clases. Por lo que sólo vamos a añadir un nuevo proyecto. Va a ser biblioteca de clases. Y tengo la mía a un lado o a otro, pero estamos lidiando con las bibliotecas de clase C-Sharp. Y de verdad sólo voy a nombrar a esta sola habitación reservando hasta punto core. Entonces esto son las pruebas de núcleo de puntos, resumiendo ahora la biblioteca de núcleo de puntos. Entonces a continuación, deja ese dotnet cinco. Y cuando eso se crea, podemos seguir adelante y eliminar la clase predeterminada un archivo. Entonces después de hacer eso, lo que vamos a hacer es tomar toda la fosa que sabríamos que necesitamos, y sólo voy a cortarlas y pegarlas dentro de nuestro proyecto central. Entonces recuerda que desde el principio, habíamos dicho que el espacio de nombres para los doctests core, el espacio de nombres predeterminado que habíamos dicho que era core. Bueno, es por eso que así miren eso. Es como un plug and play. Todo acaba de pasar a la perfección. Entonces si miramos los archivos de código veremos que encajan bien con los espacios de nombres como fueron creados. Está bien, sin embargo, notarás que tenemos un montón de líneas rojas en la prueba. Es como si ya no los pudiera ver, ¿verdad? Y por razones comprensibles. Entonces el problema aquí es que actualmente tienen el flujo interno e interno significa que el espacio de nombres, cualquier cosa dentro de la misma CSR de neón dentro del mismo ensamblado más bien puede ver es lo que nada más puede. Entonces por eso fui a conocerlos públicos porque bueno, fuera de las pruebas, necesitaremos acceder a sus externamente, así que los haré públicos. Y cuando volvamos a nuestra prueba, veremos que todavía tenemos un problema y eso es porque necesitamos una biblioteca para. Y así hago clic derecho en dependencias y el proyecto de prueba y referencias del proyecto. Y luego solo agregaremos ese click de biblioteca de clases, Ok. Y entonces todo está bien. Ahí vamos. Ahora esto está diciendo que no puede ver este método por su nivel de protección. Entonces una vez más, eso sería porque esto es interno. Por lo que esto significaba que público. Y entonces todos pueden ver a todos y todos están contentos. Ahora podemos bajar otra raíz de separar todo están refinando la disposición de nuestro proyecto. Por lo que la separación de preocupaciones no sólo se trata de crear archivos de clase individuales, sino que también está asegurándose de que las clases sean los activos que están relacionados entre sí, estén ubicados en una ubicación central. Entonces sí, Todo reserva de habitaciones, ese no es el artista está en el mismo proyecto. Pero entonces tenemos lo que podría llamar modelos, nuestros modelos de dominio aquí, separados del Huan real con los mitos y llevando a cabo un proceso, alguien para crear algo más de separación aquí. Y yo quería llamar a este uno procesadores, procesadores en niños que tienen más procesadores y el trono los puso ahí. Y en esto también se quiere agregar un dominio. O podríamos llamar a esto modelos, entonces lo llamamos modelos en lugar de dominio. Está bien, y luego voy a trasladar estos a modelos. Y fui a mover el procesador a la Carpeta de Procesos. Conoce la consecuencia de esto es que tenemos que cambiar el espacio de nombres. Por lo que a menudo voy a llamar a este pensamiento modelos y hacer lo mismo aquí. Y luego para el procesador, voy a tener que llamar a este uno Procesadores Box. Ahí vamos. Entonces todo está viendo, puede encontrar la referencia. Entonces eso es porque tienes que asegurarte de que tengamos el nuevo uso. Entonces solo voy a copiar esta declaración usando, saltar a nuestra prueba. Y solo voy a agregar que usar a Steven hace uno como el para los procesadores. Está bien, así que ahora todos pueden ver a todos los demás. Entonces si hacemos una más solo para asegurarnos, entonces las construcciones son exitosas y déjame solo ejecutar nuestras pruebas una vez más. Sólo voy a hacer clic derecho y decir Ejecutar prueba. Y las pruebas aún pasan. Entonces eso es bueno. Ahora, antes de seguir adelante, sólo voy a mostrarles algunas herramientas de productividad, algunas configuraciones en Visual Studio que pueden ayudar con la productividad. Uno, siempre puedes usar este atajo para ejecutar la libertad de código. Entonces cuando tienes estas declaraciones usando que no quieres simplemente hacer clic en él, mantén presionado Control y presiona tecla y luego E. Pero solo lo quita y lo arregla sangría en todas estas cosas, haciendo todo lo que necesitas. Hay formas de personalizar tus propios estándares para cómo debería ser una limpieza, pero no me meteré en ese nulo. Otro propina cool o otros dos consejos geniales que voy a compartir contigo, ¿verdad? No. Involucra ir a Herramientas, Opciones, ir al editor de texto, C-sharp, avanzado. Y luego puedes habilitar en el show margen de herencia que te será útil más adelante a medida que nuestra obligación y se expanda y tendremos más abstracciones y así sucesivamente. Por lo que esto realmente es útil, sobre todo cuando se trata de grandes proyectos con muchas obstrucciones. Y otra que te resultará útil es la pasta. ¿ Dónde está? A usar? Ahí vamos. Añadir Faltan usando sus activos en la pasta. Entonces eso significa que si tienes que copiar y pegar código, digamos en una copia y pegar este bloque de código a un archivo completamente nuevo, automáticamente agregará el uso para las solicitudes de reserva, que será ese usando para que no tengas que sentarte ahí y tratar de controlar los datos y llenar todas las cosas que nos faltarán. Lo hace de forma automática. Entonces creo que esas son dos buenas herramientas de producción. A medida que refactorices, quieres ser lo más eficiente posible. Y cuando tienes este tipo de herramientas que realmente te ayudan a hacerlo, nuestra ayuda para reducir la probabilidad de que cometas un error en el camino. Entonces ahora que hemos hecho con éxito nuestro primer ciclo de pruebas, ¿verdad? Escribimos, leí pruebas, escribí cotización implementada, y nos refactorizamos. Entonces básicamente solo enjuagamos y repetimos. Entonces eso es todo para la primera sección. Esa es nuestra primera prueba unitaria. Pero ahora nos meteremos en algunos más de los requisitos del sistema son los requisitos de aplicación y empezar a pescar o más cosas son pruebas. Nos pondremos un poco más complicados. Y sólo vamos a divertirnos. Yo sólo voy a decir que nos estamos divirtiendo a medida que avanzamos. 6. Consulta la lista completa de los requisitos con los proyectos GitHub: Oigan chicos, bienvenidos de nuevo. Ahora en esta lección sólo vamos a estar pescando todos los requisitos para la aplicación que necesitamos construir. Ya pasaste por nuestro primer ciclín. Tenemos gusto por escribir la prueba, implementar el código, y luego refactorizar. Entonces sabemos que tenemos dos centros escritos para todo lo demás, pero necesitamos saber exactamente lo que necesitamos hacer. Entonces en el repositorio que ya he creado para esto. Y puedes seguir adelante y crear el repositorio y puedes revisarlo usando los enlaces sexuales y de código fuente. Vamos a saltar a proyectos, alguien para crear nuestro proyecto en Git Hub, Crear Proyecto. Y voy a nombrar estos requisitos. Bueno, déjame calificar un poco más habitación reserva hasta dash requisitos son, creo que la opción de descripción en al menos para null. Y podemos elegir si queremos un Kanban básico. Kanban con libro de reseñas, alguien para elegir unas plantillas básicas de proyecto Kanban. Así que adelante y crea el proyecto. Y este proyecto básico Kanban viene con un pequeño diseño para que veamos que podemos insertar tarjetas con todos y mark-off lo que está en curso y saber lo que se hace. Entonces solo por contexto, todo el fin de semana tipo de replicar este tipo de estructura. Si hago clic en los tres puntos de este primero y digo Editar nada, entonces vemos una vista previa del tipo de sintaxis que podemos usar. A C colon colon chispas en el medio nos da esos efectos estelares. Si utilizas cool, sorry, asterisco, asterisco y tristeza y textos, obtendrás el audaz. Obtienes tu cuerpo de sangre de textos. Si quieres una casilla de verificación, solo necesitas tus llaves cuadradas. Y luego si pones una X ahí dentro, entonces la interpretará como si estuviera comprobada. Está bien, así que eso está bien. Para nodal. Voy a retirar las otras dos muestras. Alguien va a hacer clic en los tres puntos, digamos Eliminar , Note click Ok, haz lo mismo para este. Eliminar nodos, ¿de acuerdo? Y luego si queremos agregar una nota, solo podemos hacer clic en ese signo más. Entonces el primer requisito que queremos es uno que establece lo que ya hemos hecho para decir resultados de retorno con los mismos valores que las solicitudes, para que podamos seguir adelante y agregar eso. Entonces si quieres, una vez más, podrías editar, podría poner incluso casillas de verificación es una que establece lo que ya hemos hecho para decir resultados de retorno con los mismos valores que las solicitudes, para que podamos seguir adelante y agregar eso. Entonces si quieres editar una vez más, podría poner en casillas de verificación pareadas. Entonces para hacer eso, quieres tener un guión para hacerlo como un punto de bala, luego tienes tus corchetes para convertirlo en la casilla de verificación con un espacio en ella, ¿verdad? Entonces eso es espacio entre corchetes abiertos, cierre corchete cuadrado. Y luego la verbiaje real para la tarea. Entonces cuando hacemos todo eso y hacemos clic en Guardar nodos, vemos que aquí tenemos nuestras casillas de verificación listadas y que siempre podemos simplemente llevarlas todas. Entonces en realidad ya hemos hecho todos estos. Entonces yo solo, solo te estoy mostrando cómo podemos usar el restar nuestros requisitos para que puedas seguir adelante y hacer eso. Bueno, sí voy a seguir sumando los demás requisitos. Entonces seguí adelante y acabo de sumar los otros. Por lo que tienes los resultados de retorno de primer orden con el mismo valor nuestros mismos valores ya que la solicitud se va de los nuevos hechos que ya es, los otros serían lanzados excepción nula si la solicitud está vacía. Por lo que siempre que vamos a estar aceptando nuestra solicitud de una reserva, necesitamos asegurarnos de que los valores nuestros datos estén dentro de esa solicitud antes de incluso intentar la reserva. Entonces ese es otro requisito clave que necesitamos cumplir. Podemos ahorrar registro de reserva de habitaciones. Por lo que pronto estaremos agregando funcionalidad de base de datos. Y tenemos que asegurarnos de que podemos hacer eso. Consulte la disponibilidad de habitaciones antes de intentar la reserva y tienda reservando un registro con identificador de habitación, indicador de éxito de devolución en los resultados. Entonces, independientemente de que el intento de reserva haya sido exitoso o no, tenemos que asegurarnos de que lo indicamos y de que en realidad agregue el ID del registro de reserva a los resultados. Entonces esas son las cosas que esperamos lograr. Y puedes ver que realmente copié y pegué la lista de casillas de la original a través de todas las demás. Por lo que en realidad puedo simplemente deshacerme de esto unas pelotas. Entonces OK, y ahora podemos seguir adelante. Por lo que sólo puedo mover estos a través. Entonces esto se hace. Y el siguiente que tenemos es lanzar una excepción. Es lamentable que esté listado de esta manera. Y no puedo reordenarlo. A lo mejor no voy a pasar demasiado tiempo en eso. Entonces, al menos sabemos dónde estamos y los arrastraremos hasta los en curso cada vez que estemos a punto de iniciar los trabajos. Entonces eso lo compré para especialmente alterar requisitos, por supuesto, ya sabes, como proyectos que solos o requisitos por James, tienes lo que llamas scope creep. Y la vista del proyecto es una excelente manera de simplemente hacer un seguimiento de lo que se necesita hacer. También puedes combinar ese esfuerzo con la pestaña Issues, que le permite agregar nuevos números, que pueden estar en forma de solicitud de grupo, solicitudes de nuevas características. Podrás darles las etiquetas, bulbos, documentación sobre duplicado primero, UDC, lo que sea. Por lo que esta herramienta es muy, muy poderosa. Te recomiendo que dediques algún tiempo aprendiendo cómo se puede utilizar en tus proyectos. Pero eso no es, ese es un curso para otro momento en este momento solo queremos enfocarnos en superar estos requisitos. Entonces, cuando regresemos, empezaremos a trabajar en el siguiente. 7. Prueba y implementación: la excepción de la excepción al caso que la solicitud es null: Muy bien, entonces estamos de vuelta en nuestro código sobre wearable para empezar con nuestra próxima prueba. Entonces solo voy a derrumbar esa anterior. Y luego voy a poner mi efecto en la notación. Y esta vez vamos a tener el vacío público. Y el título de prueba será debe arrojar una excepción para solicitudes nulas. Entonces con eso en mente, y solo revisaré o simplemente te recordaré cómo es la prueba 3. Tenemos el naranja, tenemos la app, y luego tenemos el assert. Conociendo esta prueba, sí ve que no debe haber solicitud o el valor de solicitud debe ser nulo. Entonces no me fui a iRange y solicitas objeto. Voy a necesitar el procesador sin embargo. Y entonces mi aseveración va a parecer algo así como un miércoles deberías dejar esta vez. Entonces va a ser un buen doctor. así que has tirado un clavo a través de un fregadero si usamos Async, claro, vamos a hablar con ella sólo nos han enseñado en AsyncTask lo que otros usan throw for null. Y luego le doy el qué tipo de excepción y debería tirar. Entonces me gustaría en argumento, excepciones nulas, argumento y toda excepción es lo que se espera lanzar porque estamos viendo que el argumento que se pasó al método era nulo. Por lo que debería lanzar una excepción. Y luego abro aparatos ortopédicos. Y si solo miras el, mira los parámetros es C, Esa es su guía. Te estás guiando, permitiéndonos ver, puedes ponerte. Entonces aquí voy a hacer algo así como un delegado. Por lo que dentro de estos paréntesis, haré otro par de paréntesis con flecha Lambda. Y entonces voy a poner en ese proceso no son reservar habitación llamada. Pero aquí voy a decir nulo, ¿verdad? Entonces estamos probando si la solicitud los que están como nulos, entonces debería arrojar un símbolo de excepción, ¿verdad? Y si estás usando la búsqueda o el nativo que excede su sintaxis, entonces esto sería prácticamente de la misma manera excepto esto diría asertar, y sería lanzamientos. Entonces ya ves que son algo similares. Pero una vez más, el conflicto de elección del usuario sobre siempre se esforzó por mostrarte el equivalente lo que estoy usando, la variación astucia y todo el problema. Entonces eso son artistas realmente, queremos asegurarnos de que si el argumento es nulo, que lancemos una excepción, o puedo extender esto y realmente obtener la excepción que se está lanzando. Excepción es igual a. Y entonces podemos hacer algunas otras afirmaciones son cheques para asegurarnos de que el exception.com así que nombre param sería lo que sea común buceando la excepción, ¿verdad? Puedo ver que debe o debe ser. Y entre paréntesis veré la palabra solicita. Entonces cuando se lanza esa excepción, debería volver con ver, oh, fue lanzada por este parámetro, que en este caso deberían ser solicitudes siendo nulas. Está bien, así es como se ven nuestras aseveraciones. Por supuesto, si hacemos una construcción, puedes asegurarte de que no se rompa nada. Si hago mis pruebas, entonces nos pondríamos o prueba roja. Y lo que voy a hacer es simplemente adoptar el experto en pruebas a mi derecha. Creo que tenemos suficientes bienes raíces que podemos tenerlo a la derecha y aún así estar bien, ¿verdad? Entonces si miramos a través, vemos que todavía nos encanta el jefe de prueba anterior y ahora tenemos esta nueva prueba fallando. Está bien, así que solo voy a seguir adelante e implementar este al mismo tiempo porque no es mucho trabajo donde sí necesita agregar algo para asegurarme de que las cosas nunca sean nulas. Por lo que saltamos a nuestro procesador. Y luego dentro de un método de formulario que ahora tiene menos una de dos pruebas fallando, podemos agregar código para que sea PaaS. Entonces solo voy a decir si la solicitud o reserva solicita más bien así el nombre del parámetro. Entonces ahí mismo, vamos a fallar una aseveración también lo que la miramos. Entonces si la solicitud de reserva es nula, ¿de acuerdo? Y en versiones más nuevas de C sharp en realidad se puede escribir es nulo. Entonces si la solicitud de reserva es nula, entonces lanzamos nueva excepción argumento. Y luego por ese nombre de param, voy a ver un nombre apagado. Por lo que siempre quieres asegurarte de que mantienes tus cosas fuertemente tipadas, ya que ese 'll para actuar pero la cadena y agregar una cadena estática, solo estoy asegurándome de ver un nombre. Diré que si cambia este parámetro, el refactor es más fácil. ¿ Está bien? Entonces volvamos a ejecutar esta prueba. Y creo que una de las aseveraciones fallará independientemente y podemos mirar estos mensajes de error. Por lo que de repente hacer valer excepción, derecha, nombre de param, y luego ver debe ser solicitado comprado era reserva solicita celular es un hilo para mostrarte que eso aún fallaría. Entonces donde s, escribimos la prueba sí, código de subrútina que creemos funciona, pero luego basado en la prueba que escribimos, sigue fallando. Está bien. ¿ Por qué está fallando? Porque estamos devolviendo el nombre de las solicitudes de bookend. Entonces, en otras palabras, donde lector devolviendo la cadena de reserva solicita aquí, ¿verdad? Pero en nuestra prueba, sí vimos, déjame saltar de nuevo a las pruebas que deberíamos estar buscando las peticiones de palabra. Entonces puedo cambiar dot glassdoor necesidad de cambiar mi prueba. Por lo que a veces la prueba erosiona puede sangrarlo en un camino, ni siquiera escribiría en un cuarto. Ella es vieja, tal vez ese no es necesariamente el salón que quiero hacerlo. Y luego te refactorías a medida que avanzas. Muy bien, Entonces si vuelvo a ejecutar esta prueba, sabré que mis garrapatas verdes tienen razón y mis aseveraciones son nulas en efecto. Entonces mientras estoy aquí, sólo voy a refactorizar. Por lo que tenemos procesador aquí. Tendría procesador aquí. Y para la mayoría, si no todas las pruebas que vamos a realizar, todos van a estar a bordo de un procesador. Entonces en lugar de hacer una nueva instancia de procesador cada vez que tenemos un nuevo método, ¿no? Y entonces eso serían 10 puntos diferentes a actualizar. Lo que podemos hacer es armar un constructor, ¿verdad? Entonces iba a decir CTR tina, tina. Y sólo voy a poner en el procesador de puntuación es igual a nuestro nuevo procesador. Por lo que esta sola línea, quería tomarla. Y entonces por supuesto necesito un campo para este punto de control y generar el campo. Ahí vamos. Entonces a lo largo de todo, ya no quiero duro para hacer este arreglo. ¿ Verdad? No tengo que arreglar procesador cada vez porque ahora puedo hacer mi naranja una vez en el constructor. Y entonces puedo usar este objeto arreglado en todas partes. Entonces dondequiera que tenía procesador, Todavía está en el procesador de puntuación. Entonces si vuelvo a ejecutar estas pruebas, veremos que siguen pasando y sabemos que el código se ve más limpio. Entonces una instancia sirviendo a muchos maestros. Entonces esa es otra semana y empieza a refactorizar tus pruebas para reducir la repetición en la fase de prueba misma. 8. Crea servicios de reservas: Muy bien chicos. Por lo que la siguiente tarea tiene todo configurando algunas cosas incluyendo nuestro servicio o repositorio, que va a almacenar todas nuestras operaciones de Gandalf, ya sabes, relacionadas con datos. Entonces en ninguna parte mirando más separación de preocupaciones porque queremos obstruir la base de datos un poco cosas de la lógica empresarial real, las afirmaciones if en cuanto a si esta solicitud es o no OKR y así sucesivamente, ¿no? Entonces lo que vamos a estar haciendo en este es configurar nuestro servicio de reserva de habitaciones ojo. Por lo que edité ese registro de reserva de habitación, nada y agregué esta tarea extra. Puedes hacer eso si lo deseas, y también mover el último o el previamente creado a la pila completada. Entonces saltemos al código. Y en el proyecto core voy a agregar una nueva carpeta a la que voy a llamar servicios, servicios de datos. Y en eso vamos a añadir una nueva, sólo voy a decir clase, pero realmente va a ser una interfaz. Y lo estoy limpiando a i servicio de reserva de habitaciones. Y podemos añadir eso. Cambiamos esto a interfaz pública. Y en esta interfaz vamos a tener un método que va a regresar, bueno, no necesita devolver nada. Sí, es un método de guardar por lo que no devuelve nada, al menos no retiniana. Entonces es nulo, Guardar, y estará tomando parámetro para la reserva de habitación, ¿verdad? Entonces el caso es que hasta ahora hemos estado tratando solicitudes y resultados. No obstante, cuando estemos ahorrando, tendremos que ver como una versión lista de base de datos de la solicitud. Y eso va a requerir que introduzcamos un nuevo tipo. Entonces sólo voy a poner en una carpeta nueva. No quiero llamarlo el medio en las modelos y amar el dominio. Y luego en lugar de dominio, agregaremos una nueva clase. Bueno, eso está bien. Ese fue el paso uno por uno, cierto. Por lo que fui a llamar a esta reserva de habitación. ¿Verdad? Y luego es reserva de habitaciones. Entonces este es nuestro nuevo tipo de datos que vamos a necesitar. Así que i servicio de reserva de habitaciones y es bueno tener un método para ver la reserva de habitaciones y espera obtener algo de las reservas de habitaciones datatype. Tan bien el camino hasta se transforma fuera los valores de las solicitudes de reserva de habitaciones, sea lo que sea. Entonces si has hecho diseño de aplicaciones, apreciarías que a veces tienes que masajear la entrada antes de poder enviarla a la base de datos. Entonces para eso estamos preparando nuestro código separando estos nulos, necesito esta habitación reservando algunos, solo voy a crear este nuevo archivo por sí mismo. Pero por ahora va a tener los mismos campos que las solicitudes. De acuerdo, así que voy a seguir adelante y copiar y pegar esos. Y se puede ver esa extensión en la función R-dot que es agregar animar a habilitar recientemente en el trabajo, derecha, cuando lo pegué automáticamente agregó que usando sentencia para mí. Y él Whoa, lo que voy a hacer es sacar esto de los servicios de datos y poner eso en el medio de la factura. Y luego cambiaré eso a dominio por supuesto, y actualizaré la referencia dentro de la interfaz. Entonces ese es al menos el paso uno para simplemente prepararnos para el próximo movimiento, que es cuando estemos escribiendo la prueba, tendremos la interfaz lista para usar. Y lo que vamos a estar haciendo es asegurarnos de que estamos ahorrando nuestras solicitudes de reserva de escritorio. Y en eso vamos a trabajar en la próxima prueba. 9. Prueba de unidades: guardar una reserva de habitación: De acuerdo, entonces estamos de vuelta en nuestro código de prueba y la siguiente prueba que vamos a hacer es querer asegurarnos de que realmente guardemos el registro, ¿verdad? Entonces sólo voy a copiar todo esto y recompensar en consecuencia. Y esta prueba se va a llamar debería guardar las solicitudes de reserva de habitaciones. Está bien, ahora dentro de esto, lo que tenemos que hacer es llamar a nuestro procesador. Esos por supuesto, tenemos que llamar. Y estamos llamando a las salas de libros para que veas cuánto más fácil se hace eso. Sabemos que el procesador está ahí para ti por lo que no tienes que inicializarlo de nuevo. Y dentro de esto, necesitamos nuestra petición. No. No tenemos peticiones. Tendría que arreglar otra solicitud, pero ya hicimos tipo de arreglar nuestra solicitud aquí arriba. Correcto. Entonces lo que voy a hacer es seguir el ejemplo. Voy a sacar esto del arreglo para esta primera prueba que hicimos. Y lo voy a poner dentro del constructor. Y en lugar de tener una variable local, convertiré en un campo. Por lo que generamos el campo en la solicitud de puntuación. Y luego en cualquier lugar que dicho solo solicita solo reemplazamos con solicitud de subrayado. Esta solicitud representa nuestras peticiones de pruebas y un artista las solicitudes se pueden utilizar en cualquier lugar lo necesitemos para ser utilizado ya que esa oferta superando a este objeto una vez más, ponerlo en el constructor, y luego simplemente podemos reutilizarlo a lo largo de los artistas. Entonces ahora que he hecho las pistas más globales de Irene que en realidad podemos simplemente saltar directamente a la derecha. Ahora antes de poder hacer cualquier aserción aquí, necesitamos configurar, copiar nuestras pruebas versión lista de nuestra interfaz. El motivo por el que hicimos las interfaces para que se pueda inyectar en cualquier lugar que lo necesitemos. Pero sigue siendo una interfaz que necesita configurarse porque tiene un método. Necesitamos ver bajo circunstancias de prueba host en caso de que este método funcione. Entonces eso es lo que llamamos burla. Por suerte, hay una biblioteca muy buena utilizada para este tipo de cosas. Y vamos a ver cómo funciona eso nulo. Entonces voy a decir subrayado marca de servicio de reserva de habitaciones es igual a nuevo Mock capital M o CK fuera de nuestra interfaz, que sólo voy a copiar rápidamente eso y pegarlo automáticamente obteniendo las declaraciones de uso, eso es tan genial. Y luego cierra los aparatos ortopédicos. Y luego para el simulacro, obviamente no es algo que acabamos de tener. Controlaríamos WC instalar paquete, simulacro, digamos puede seguir adelante y dejar NuGet, encontrar e instalar la última versión. Y cuando eso se hace, automáticamente obtenemos la declaración de uso. Y entonces podemos inicializar nuestro campo por el nombre de servicio de reserva de habitación simulada o. Entonces. Observe que está fuera del tipo que queremos, pero también es MC. Entonces estamos diciendo que me des un objeto simulado del tipo de datos. No obstante, este objeto sigue siendo un poco vacío. Tenemos que hacer lo que llamaremos la configuración. Por lo que todavía estamos en esa fase de rango. Y ahora tenemos que sentarnos realmente este método para hacer lo que creemos que debe hacer antes de llegar sin embargo. Más importante para mí es el hecho de que necesitamos inyectar este servicio en nuestro procesador. Entonces si no estás tan familiarizado con qué es la inyección o la inyección de dependencia, te sugiero que mires uno de mis cursos anteriores sobre desarrollo del núcleo ASP.Net, donde mostramos qué es realmente la inyección de dependencia y cómo ayuda. Ahora en este punto, este es un servicio que realmente va a usar el procesador después de que termine su lógica de negocio en sus cheques, va a utilizar ese servicio para efectuar cualquier cambio real que deba suceder al recibir el solicita. Por lo que eso significa que necesita un objeto de servicio de reserva. Todavía no se ha preparado para eso. Entonces lo que voy a hacer es tomar esta declaración de procesador y fui a moverla. Entonces después de que tengamos el Mach, entonces fui a decirle esto que también debería tomar un parámetro de nuestro objeto simulado. Entonces cuando decimos burla, es literalmente el tipo de cualquier tipo. Pero queremos el tipo concreto real. Tenemos que ver los objetos simulados. Y si pasas por encima del objeto, ves que en realidad nos está dando sobre el servicio de reserva de habitaciones de ojos. El servicio de reserva de habitaciones es en realidad el MAC fuera de eso. Entonces estamos obteniendo el valor físico. Ahora la línea roja, podemos abordar esto diciendo controller.js y luego lo podemos decir en el parámetro a nuestro constructor para nosotros, ¿verdad? Entonces eso es realmente reducir el buck y adelante entre el código rápido. Ellos ven no, La línea roja se ha ido. Si saltamos por encima, no es conseguir ese objeto, volveremos y renombraremos ese no reflejado que pronto. Pero en este momento solo les estoy mostrando para qué nos estamos preparando porque en todo podemos inyectar el servicio en nuestro procesador de solicitudes y luego podemos usar cualquier cosa fuera del servicio dentro de cualquier método dentro de nuestro procesador. Por lo que volver a nuestra prueba hasta ahora o nuestra gama nos tiene con las solicitudes de prueba. Después tiene una configuración del repositorio Mach, nuestro servicio de simulacros. Y luego estamos configurando nuestro objeto procesador, que toma ese objeto simulado como su parámetro. Conociendo nuestra prueba real, necesito que el simulacro sepa cómo debe comportarse. Podría haber hecho eso aquí arriba. Pero entonces eso hubiera sido global. Y sólo un método realmente necesita ese tipo de configuración en este momento al menos. Está bien, así que veamos cómo va a ser todo este método. Por lo que todavía tenemos que hacer algún arreglo. Y lo voy a hacer por encima del acto. Entonces inserciones o lo óptimo, nosotros, claramente las cosas han cambiado. Entonces pongamos en marcha lo que necesitamos. Por lo que voy a tener mi objeto de reserva tipo habitación. Recuerda que acabamos de crear esa en el dominio. Por lo que habitación will king es igual a null. Por lo que empieza vacío. Entonces vamos a ver nuestro objeto simulado. Podemos decir configuración de puntos MLK. Ahí vamos. Y esto toma una expresión lambda, solo usaré q. Y luego podremos llamar al método que queremos establecer. Está bien, entonces en otras palabras, cuando este Mach está involucrado, ¿cómo quieres que se comporten ciertos métodos? Cuidado con el método2 en una circunstancia de prueba, eso es lo que trae a la mesa. Entonces fui a ver la salvada porque eso es lo que estamos a punto de hacer pruebas, ¿verdad? Cuando te llaman, Estás configurando configurarlo para saber que debe tomar cualquiera así veré que es cualquier objeto fuera de la reserva de solicitud. Por lo que habitación se King solicita tipo. Ahí vamos. Está bien, y luego cierran paréntesis. Entonces eso debería funcionar lo que estoy viendo nuestra línea roja. Y es porque estoy usando el tipo de datos equivocado. Esto debería ser apologistas de reserva de habitaciones, ¿verdad? Entonces esos van a salvar los objetos de dominio, ¿verdad? Por lo que esto debería decir Guardar, es cualquier reserva de habitación. Entonces es decir dame cualquier objeto siempre y cuando sea dieta suave, reserva de habitación. Correcto. Entonces para continuar, voy a hacer lo que ustedes llaman un call buck. Entonces, en otras palabras, cuando se llama a este método, ¿qué debe pretender hacer? Entonces el método de devolución de llamada va a decir R. Te da el tipo de datos que es debo citar unquote return o process. Cuando se llame a esto. Se puede leer la documentación si es necesario. Pero para el call buck, sólo vamos a ver reserva y luego una expresión lambda. Por lo que es casi como una función delegada realmente. Y luego dentro de esto, vamos a ver que el objeto de reserva de habitación aquí es igual al objeto de reserva aquí. A lo mejor puedo cuantificar estos nombres un poco más. Alguien a ver. Guardado buscando. Muy bien, entonces el Save, el objeto de reserva que empezamos como nulo debe saber, obtener el valor de lo que se estaba pasando durante la prueba. Muy bien, punto y coma, punto y coma. Y esa es nuestra configuración para nuestro simulacro, o la configuración para el método save en nuestro objeto simulado para nuestro servicio. De acuerdo, así que parece complicado, pero una vez que empieces a hacer esto cada vez más, será más fácil y tendrá más sentido. Entonces después de que hayamos hecho eso, entonces en realidad llamamos al procesador. Y luego después de que llamemos al procesador, necesitamos verificar que el método fue llamado alguien para decir punto simulado. Por favor, verifique eso. Y luego nuestra expresión lambda, Guardar o Guardar Método. Y estamos verificando que consiguió uno, El objeto de cualquier reserva. Y luego dos, vamos a verificar. ¿ Verdad? Entonces verifica eso, guarda con él es cualquier objeto de reserva. Y luego el siguiente parámetro, si solo pasas el mouse, lo verás en el experimentador sería el número de veces que se llamó. Para que puedas poner suficiente mensaje de fallo, puedes poner en cosas diferentes. Pero lo que queremos verificar es que se llamaba 1 veces 1. ¿Está bien? Entonces, en situaciones como esta, lo que puedes hacer es decir cuando estás llamando a un método o cuando llevas a cabo esta opción, verifica que ciertos métodos de claves en el camino fueron llamados una o dos veces. Diga si está probando eso con esta entrada, este método debe llamarse dos veces, o si debe llamarse triplica, etcétera. Se puede ver una vez, se puede ver exactamente una vez, al menos una vez, ¿verdad? La mayoría, menos, por así decirlo, ¿verdad? Para que puedas, Es bastante flexible con los tiempos que puedes usar. Entonces una vez más, estamos a la vez. No quiero saber si lo llamaron dos veces, entonces tengo un error. Está bien, Ahora, después de eso, verifique, podemos seguir adelante con más aseveraciones. Por lo que podemos ver aseverar que esto no es nulo. Así que guardar Booking dot no debe r. déjame sólo nulo. A veces es, Es más fácil sólo la palabra filtro no analítico que es old. Por lo que no debe ser nulo. ¿ Todo bien? Y todas las aseveraciones serían algo similares a esto. Lo que hicimos aquí arriba, donde estos deberían ser iguales. Por lo que solicita punto nombre completo. Por lo que CVE Booking dot nombre completo debe ser el mismo que el nombre del flujo de solicitud. El correo electrónico debe ser el mismo que el correo electrónico de solicitud y la fecha debe ser la misma que una fecha. De acuerdo, así que esas son mis aseveraciones. Voy a ejecutar sólo esta prueba y haciendo clic derecho en ella. Por lo que en la prueba las semillas expertas están en ello. No está mal. Nunca se arruinó, así que no sabe si arruinaría. Y entonces puedo simplemente hacer clic derecho en él y decir Ejecutar. Y en Rusia y ha fracasado. Y si solo echamos un vistazo a lo que viste, dice la invocación esperada en el simulacro una vez comprado fue 0 veces Guardar. Está bien, así que diciendo esperábamos que esto se llamara al menos uno. Entonces cada vez que hicimos el acto, pero nunca se llamó. Está bien. Entonces eso es todo lo que el MAC verifica funciona. Entonces no, podemos seguir adelante y leer, perdón, podemos seguir adelante e implementar el código para hacer todo esto llamado a la vida. 10. Implement: guardar una reserva de habitación: Por lo que de vuelta en nuestro procesador, vamos a poner en lo que necesitamos para que nuestra prueba esté de acuerdo. Entonces vemos dos de cada tres pruebas están pasando, ¿verdad? Y tenemos que escribir el recordatorio de cuál fue el fallo de prueba. Entonces a veces es bueno simplemente tener esto arriba para que puedas leer el mensaje y luego mirar tu código al mismo tiempo. En ocasiones, ya sabes, solo tenerlos levantados al mismo tiempo puede ayudarte a conjeturar lo que necesitas modificar. Entonces en este punto, lo que quiero hacer es limpiar un poco esto. Entonces necesito terminar esta inyección, ¿verdad? Por lo que Control puntea la declaración de uso adecuada para esto. Ahí vamos. Y fui a llamar el nombre de este objeto en sí nuestro servicio de reserva de habitaciones, punto de control, y permitirle crear un campo asignado. , como saben, prefiero usar el subrayado para los nombres de campo. Entonces sólo cambiaré eso por un factor unario. Y entonces más o menos lo que tenemos que hacer es introducir el de. Entonces uno, obtenemos las solicitudes de reserva. Si es nulo, lanzamos la excepción para que sepamos de eso. Pero entonces en medio del lanzamiento están los chequeos y verificando que está bien y regresando, necesitamos ahorrar. Entonces si está bien, necesitamos ahorrar. Entonces lo que voy a hacer aquí es sólo decir servicio de reserva de habitaciones, dot save. Y entonces eso lleva una nueva habitación reservando objetos. Así que sólo diga reserva de habitación nueva. Y no me gusta ver esos prefijos se refieren a poner en la declaración de uso. Por lo que reserva de habitación. Y entonces este objeto necesita datos que más o menos son los mismos datos que habrían estado presentes en las solicitudes de reserva, ¿verdad? Entonces en realidad solo voy a copiar esto y pegarlo ahí. Está bien. Y ahí lo tenemos. Ahí vamos. Por lo que ahora tenemos nuestra reserva de habitación siendo guardada o método de guardar siendo llamado. Obtener cualquier cotización unquote, cualquier habitación buscando objeto. Y saber si vuelvo a ejecutar mi prueba, entonces me levanto pasando marcador. Tan fácil que fue no. Claramente, aquí está pasando mucha repetición, ¿verdad? Entre esta línea están esas pocas líneas, esas pocas líneas y las similitudes entre nuestra solicitud de reserva y nuestro resultado en el dominio real. Hay oportunidad para nosotros de tipo de limpiar pasillo que se acerca, extendiendo todos los bits de código. Entonces, empecemos viendo las similitudes y veamos cómo podemos condensar, ¿no? Por lo que tenemos la reserva de habitaciones con estos tres campos, después tenemos una solicitud y los resultados web. Mantenerlos separados es importante. No obstante, queremos reducir la repetición entre todos ellos. Para que podamos introducir, solo copiaré y pegaré uno de los resultados de reserva de habitaciones. Y centro otoño-invierno aquí es reserva de habitaciones. Base. bys de reserva de habitaciones representarán y solo Puntos de control. O más bien necesito cambiar el nombre de este archivo, lo siento, así que simplemente renombra el nombre de la clase. Ahí vamos. Entonces tendremos base de reserva de habitaciones, que tiene todos los objetos, ¿no? Y fui a conocer este resumen porque no quiero que nadie pueda crear una instancia de la sala mirando a BCE. Pero va a servir el propósito de la herencia a través de todos los demás. Por lo que puedo quitar sus declaraciones manifiestas los campos que tienen en común porque ahora todo existe en la base. Está bien. Por lo que lo mismo para mirar habitación, puedo quitar esto y dejar que herede de la base de reservas de habitaciones. Ahora si hago una construcción, todos siguen contentos. Eso es bueno. Por lo que ese refactor funciona. Está bien. Y como estaba diciendo, cuando inicializas el margen de herencia, podrías saltar entre archivos bajo implementaciones base mucho más fácil, bien, o mucho más fácilmente. Entonces eso es lo que es este margen de herencia. Cuatro, si te funciona, si te parece genial, entonces no hay problema. Si no, entonces eso está bien. Ahora, cuando volvemos a nuestro procesador, tenemos la oportunidad de hacer la creación de estos objetos. Seré más genérico. Porque ven aquí realmente sólo estamos repitiendo código. Y ambos están tocando en el archivo viene de las solicitudes de reserva. Entonces voy a crear un método privado que va a devolver el tipo de datos T. Así que si alguna vez has oído hablar de la reserva genérica de té o de salón de té, ¿verdad? Entonces reserva de salón de té, sólo lo estoy llamando genérico. Crear. Objeto de reserva de habitaciones. O solo diré crear, sí, habitación. Objeto rey. Estoy siendo explícito con mi nombre de método, eso es todo. Y entonces eso le va a hacer saber que es un genérico, ¿no? Por lo que solo lo llamamos T room booking object, create room looking object es el nombre del método y es parámetro genérico es lo que debería estar devolviendo. Se va a tomar un parámetro de las solicitudes de reserva de habitaciones. Entonces solo copiaré eso, lo pegaré ahí. Y luego voy a destapar esto para que tengamos un poco más realista para esta actividad. Y luego fui a especificar donde el salón de té voluntad King objeto está fuera de tipo habitación base de reserva. ¿ Verdad? Entonces, en otras palabras, estoy dispuesto a poder pasar en cualquiera se llaman este método y tengo que pasar en un parámetro o dejarlo saber del genérico ser relativo a la reserva de habitación de tipo de datos sea tan cualquier cosa heredar de las abejas de reserva de habitaciones se puede utilizar como un genérico. ¿ Está bien? Entonces después de hacer eso o implementación básicamente solo va a decir devolver un objeto de reserva de salón de té. Y más o menos va a tener los mismos campos que nombre completo. Garganta, correo electrónico. Perdón, debí haber puesto esa nueva palabra clave retorno, reserva de salón de té nueva, punto y coma. Y estoy recibiendo un error, poco crear instancia 0. No detiene lo nuevo, lo siento, eso debió ser nuevo, el fin de la misma. Y ahí vamos. Todas las líneas rojas se han ido. Está bien. Entonces supongo que podría acortar algunos de los nombres, correcto, para que no se estire tan lejos en los multillizos de pantalla que haré es solo romper la línea para que puedas ver todo el código. Entonces todo eso es la primera línea. Y luego abrimos los frenos, y luego hacemos nuestra implementación aquí. ¿ Está bien? Entonces el propósito de esto será reemplazar nuestras declaraciones explícitas aquí es en lugar de ver nueva reserva de habitación y repetir que puedo saber, digamos crea habitación buscando objeto. Yo quiero algo fuera de tipo habitación will King, que hereda de la base. Y estoy pasando las solicitudes de reserva como parámetro. Ahí vas. ¿ Todo bien? Y entonces puedo hacer lo mismo por los retornos. Por lo que sólo puedo decir que el retorno crea el objeto de aspecto de habitación, pero sería la regla de tiempo fuera, los resultados de la reserva de tipo habitación. Y ahí vamos. Por lo que eso se ve mucho más limpio, mucho menos repetición entre los dos. Y vemos cómo los genéricos pueden ayudarnos a mantener limpio nuestro código. Y simplemente se quedó la sugerencia de Visual Studio para mí en el método estático. Ahí vamos. Ahora por supuesto, el momento de la verdad son tres pruebas, así que solo haré todas mis pruebas. Y me estoy poniendo garrapatas verdes todo el camino. Entonces eso es todo para implementar esa prueba. Hicimos un refactor e hicimos el retest. Y una vez más, sólo vamos a seguir rodando por estas actividades en consecuencia. 11. Prueba de unidades: consulta que la habitación esté disponible: Bueno, somos equipo. Oh, lindo. Entonces estamos en la siguiente actividad y esa es la disponibilidad de check room antes de intentar la reserva, ¿verdad? Por lo que necesitamos agregar algo de lógica para asegurarnos de que comprobamos y ver si hay alguna habitación disponible. Y luego si no hay habitaciones disponibles, entonces no hacemos llave enrutable. Y envío símbolo, ¿verdad? Por supuesto, hacer la contaduría es lo mismo que guardar el aumento de la carga. Entonces saltemos a nuestras pruebas. Y yo sólo voy a hacer la copia regular y pegar y renombrar. Y éste no debe guardar las solicitudes de reserva de habitaciones si no está disponible. Entonces dentro de este método, necesitamos hacer algunas cosas. Antes de llegar a ese método. En realidad necesitamos crear algunos métodos nuevos dentro de nuestro servicio de reservas. Entonces déjame saltar a la interfaz. No hace implementaciones, así que lo siento, eso fue Control F 12, deberías tener, puedes usar sobrantes, puedes control-click. Y por aquí, voy a decir, dame un nuevo método que regrese. Voy a utilizar yo innumerable, creo que eso es un genérico en nuestros tipos de colección. Entonces dame una colección de habitaciones. Por lo que necesito un nuevo objeto llamado habitación. Y fui a llamar a esto, obtener habitaciones disponibles aún disponibles. Está bien. No, Este método va a tener que tomar la solicitud de la derecha. Entonces solo diré que la fecha y hora sí. Y todo lo que necesitamos para crear estos nuevos objetos. Entonces creando un nuevo archivo. Y por supuesto, esta habitación objetos tiene que estar en el dominio, ¿no? Entonces simplemente lo moveré, cambiaré el espacio de nombres. No necesitamos nada en ese objeto todavía. Sólo necesitamos saber que está ahí. Y nuestras interfaces felices consigue habitaciones disponibles está bien, eso está bien. Ahora dentro de nuestra prueba con nuestra configuración para nuestro simulacro, necesitamos hacerle saber que debe regresar. Bueno, al configurar el Mach, necesito dejar saber el método de disco disponible que debería devolver la lista de habitaciones. Ahora en este punto, voy a, vale, dejaré ese paso uno a la etapa de refactorización. Pero lo que vamos a hacer es tirar de este tipo de configuración, configuración dentro de la prueba. Lo que hicimos en una fecha tan posterior. Entonces para null, déjame solo seguir adelante y hacer el mismo tipo de configuración un caso IV, solo quieres un recordatorio, siempre puedes mirar la configuración anterior donde hicimos la configuración para nuestra caja fuerte. Por lo que necesitamos tener una lista de habitaciones. Voy a crear una lista de brevedad de campo de tipo habitación para este tipo de cosas habitación. Adelante y agrega la declaración de uso, y llamaré a esto habitaciones disponibles. Entonces si es privado en el marcador habitaciones disponibles, ¿verdad? Y luego dentro de nuestro constructor, voy a inicializar las habitaciones disponibles para ser una nueva instancia de listas con habitación, con al menos una habitación en ella. Tan nuevos objetos de habitación, al menos uno. Entonces de esa manera sabemos que no está vacía. Entonces en la configuración, vamos a decir O servicio de reserva de habitaciones, simulacro de configuración de puntos. Y esta vez voy a estar llamando al método de habitaciones disponibles, que va a tomar su petición como su parámetro. Y nota en esta situación estoy usando un valor exacto. No estoy usando lo arbitrario. No es cualquier habitación buscando porque literalmente necesitamos probar contra las peticiones, necesidades que podemos cambiar en cualquier momento. Por lo que configuración aún las habitaciones disponibles. Y luego para éste es un valor regresando. Entonces no es evitar como el ahorro donde sólo tuvimos que llevar a cabo con oxígeno. Por lo que esta vez tengo que ver este BreakLine puntos regresa. Y entonces nos dirá qué se espera regresar o watts delegado podemos llevar a cabo, pero solo necesitaba llevar a cabo regreso con las listas de habitaciones disponibles. Teníamos IRI y previamente sabiendo conformarnos con una prueba, habiendo hecho todo ese arreglo previo a esto, lo que voy a hacer es habitaciones claras o disponibles porque recuerda que no debe hacer la reserva si hay una no disponible. Entonces si las habitaciones disponibles es el punto de referencia, entonces cuando esté ejecutando esta prueba, voy a asegurarme de que haya cotización sin cotización, no hay habitaciones disponibles. Entonces voy a llamar a mi procesador para reservar habitación con la solicitud. ¿ Está bien? Y luego voy a verificar, y sólo voy a copiar y pegar. Poco escribió todo esto antes, así que solo estoy verificando que esto nunca se llame. Está bien. Agradable y simple, ¿verdad? Entonces vamos adelante y vemos una vez más habitaciones disponibles. Sí, tenemos una lista de habitaciones disponibles. Tenemos una lista y tiene al menos una habitación en ella. Por lo que sabemos que podemos probar las habitaciones disponibles. Pero entonces este caso, queremos decir que no debería hacer ninguna reserva si no están disponibles. Por lo que voy a simular que no haya habitaciones de reserva disponibles borrando mi lista. Y entonces el procesador va a hacer su llamada regular. Y entonces sólo vamos a verificar que esto nunca se llame. En este punto. Esto está actuando como una aserción. No necesito ninguna otra aseveración porque no necesito verificar que algún valor haya regresado o los de nadie sean iguales a cualquier otra cosa. Simplemente va a ver que nunca se llama. De acuerdo, así que probemos este nuevo. Y estamos leídos y creo que estamos bien para ir. Por lo que vamos a saltar a la implementación del código para que esto suceda. 12. Implement: consulta si la habitación está disponible: Está bien, Así que ya tenemos prueba, saltemos y hagamos nuestras modificaciones para que el artista pase. Entonces saltando a nuestro procesador de peticiones, la condición es que si hay habitaciones disponibles, entonces podemos seguir adelante y ver si no hay habitaciones disponibles, entonces no se debe llamar al método de guardar. Alguien para empezar consiguiendo las habitaciones disponibles. Diré var habitaciones disponibles es igual a mi servicio de reserva de habitaciones punto obtiene habitaciones disponibles para el bit de solicitud actual. Haciendo eso, puedo ver si las habitaciones disponibles puntan conos. Por lo que esto está devolviendo un innumerable SF para decir cono abierto y cerrar es mayor que 0. Y esto requiere de enlace. Ahí vamos. Entonces si las habitaciones disponibles puntan conos, y entonces aquí está viendo que sugiere en estos que podría ver adoptar cualquiera, ¿verdad? Entonces si hay alguno, lo que sólo me devolvería un booleano. Si hay alguno, entonces puedo ver. Entonces con eso, si condición entramos tres pruebas y nuestra prueba está pasando, entonces si no hay ninguno, entonces esto nunca se llamaría. Está bien. O si no hay habitación disponible que nunca se llamaría. Está bien. Entonces vamos a hacer dos actividades. No. Una, sólo voy a discutir brevemente lo que mencioné antes sobre probablemente refactorizar o reorganizar cómo hacemos nuestras configuraciones. Entonces en el pasado he trabajado en proyectos donde en lugar de configurarme en cada método individual, para cada método individual como se necesita. Lo que hicimos fue crear un solo archivo que acaba de devolver todo el simulacro con todos los datos de muestra, todas las configuraciones, todo. Por lo que tenemos 1 de contacto. Si necesitas hacer una configuración, si necesitas hacer algo relacionado con el objeto simulado, tenemos 1 de contactos y todo lo que es relativo a cómo estás interactuando con los datos. Por supuesto, porque en nuestra situación, antes es un intento rasgar estas cosas construidas, por supuesto como habitaciones. Se podría construir una pseudo lista de habitaciones en otro lugar, pero las habitaciones disponibles están siendo utilizadas por otros lugares. Por lo que tendrías que tomar eso en consideración. También para un anuncio para conformarse con la reserva de CFD. Aquí tenemos la ganancia de sílaba, pero estamos haciendo algunas aseveraciones en su contra. Entonces por qué parecerían lo suficientemente fáciles de rasgar todo este OTA y simplemente hacer la configuración en su propio archivo. Y entonces obtendríamos el método de guardar ya configurado. Siempre que obtenemos un objeto simulado a través de ese archivo, tenemos que considerar algunas de las aseveraciones sobre las dependencias, ¿verdad? Entonces con eso en mente, no necesariamente voy a seguir adelante y hacer cualquier refactorización con las pruebas. Yo solo quería señalar que dijiste si ves la oportunidad de hacer eso, entonces puedes saber lo segundo que quería hacer es mostrarte cómo puedes depurar. Por lo que a veces puedes escribir una prueba que crees que está funcionando o debería funcionar. Y en relación con el código que escribiste, al menos la prueba y el código deberían trabajar juntos otros y por alguna razón la prueba está fallando y no estás del todo seguro por qué. Y probablemente te esté diciendo algún MRSA que no sea necesariamente para ver cuál es el error. Entonces hice un error o simplemente modifico las pruebas que escribimos y lo modificamos para que pueda fallar, ¿verdad? Para que no necesariamente tengas que hacer esta actividad, puedes ver lo que estoy haciendo. Esto, pueden entender esto funciona. Entonces hice el testfile, ¿verdad? Y dice que inspeccionaron la invocación al Mach es una vez, pero nunca se llamó. Entonces ese pincho, tengo curiosidad por eso. Mi prueba dice que debería llamarlo 1s, pero en base al trimestre ROTC recordándolo dado el escenario de prueba. Entonces por supuesto quiero saber en qué momento está mi código haciendo algo que no deberías hacer. A veces puede ser artistas, ¿verdad? Por lo que solo tienes que asegurarte de revisar ambos lados. Entonces voy a escribir la prueba en sí y luego decir Debug. Y antes de depurar, en realidad poner un punto de ruptura en algún lugar del método, ¿verdad? Por lo que debería haberlo dicho antes. Por lo que antes de habilitar, desea poner su punto de ruptura. Puntos de ruptura tan regulares como lo que usarías cuando estás regularmente o de forma rutinaria construyendo algo en tu código, puedes usar esos. Y cuando entras en modo de depuración con la prueba, en realidad los reconocerá. Entonces va a seguir adelante, su relativo al escenario de prueba, ¿verdad? Entonces si miramos las solicitudes de reserva, verás que este objeto es exactamente el material de prueba que nos habíamos burlado en nuestra clase de prueba. Si miras las habitaciones disponibles, no es nulo. El solicitado es que si paso, entonces ves las habitaciones disponibles es 0. ¿ Por qué? Porque los despejamos antes de que se ejecutara esa prueba en particular. Está bien. Entonces digo si las habitaciones disponibles es alguna, entonces debería ir y decir si es 0, si la corriente es 0, entonces no hay ninguna. Se salta por encima. Y así nunca causa que es por lo que a mí respecta, es hacer lo que se supone que debe hacer. Entonces mientras que el ECS, continúo y luego salta a la línea nota que la historia y el error, al ver la invocación inspeccionada son unos lo que se llamó 0 veces. Y entonces me di cuenta, oh, mi invocación está mal. No debería estar revisando que se llame una vez. Debería estar revisando para que se llame. Nunca. Está bien. Bueno, solo te estoy mostrando cómo el modo de depuración puede ayudar a 0. Es tal vez fuera qué puntos de tu código está haciendo algo donde es relativo a la prueba o en qué puntos de tu prueba, tienes un error. Muy bien, Así que tienes que asegurarte de que estos dos funcionen en tándem para que yo pueda dejar de depurar después de hacer ese cambio al nunca, ya tenías eso para que no tengas que preocuparte por ello. Pero cuando volvamos a ejecutar esta prueba verá que no pasa. Está bien, así es como puedes seguir adelante y agregar un poco de depuración a tus pruebas a medida que avancas. 13. Prueba y implementos: agrega sitio Id a la resultado:: Muy bien chicos. Entonces para esta actividad, no va a ser una actividad larga es realmente sólo un adenda a algo que ya hemos hecho. Y creo que podemos hacer tanto prueba como implementación y refactorizar todo en una sola sesión en esta situación. Muy bien, por lo que el siguiente requisito es que la identificación de la habitación que se reserva esté presente en el registro de reserva de habitación. Entonces es realmente esto una adición a cuando sabemos que vemos la habitación buscando registro, necesitamos asegurarnos de que haya una cárcel de identificación. Voy a saltar a nuestra lista de habitaciones están disponibles y voy a poner en el campo para el objeto de la habitación. No tiene por qué existir. Eso está bien. Pero ID es igual a otro, digamos uno para yo solo quisiera probar método. Por lo que de nuevo, este control dotnet se consigue la propiedad en salto sobre. Y ves que ya es un entero, entero público. Eso es bueno. Está bien, entonces ahora tenemos al menos esa identificación en para nuestro, mientras que debería tirar, debería ver, ahí vamos. Lo que voy a decir es que el guardado Booking.com. Y en este punto no hay identificación de disco en la habitación mirando tampoco. Por lo que reserva de habitaciones base de reserva de habitaciones, no el resultado puede ser el resultado, pero no la base. No lo quiero en la base porque la solicitud no tendría ninguna identificación de habitación. Correcto. Entonces sólo voy a darle una propiedad, digamos prop top tina. Y esto va a ser identificación de habitación. ¿ Todo bien? Entonces voy a decir reserva guardada, identificación de habitación. Debe ser, y debe ser igual a, en esta situación, el primer ID de la lista de habitaciones disponibles. Entonces sólo voy a decir que debe ser en una plaza habitaciones disponibles, puntos. En primer lugar, quiero el primer objeto en sus puntos de control usando link first dot ID. De acuerdo, así que una vez que eso se llame, entonces cuando estamos verificando todas estas cosas, esa habitación ID debería ser la misma que el pozo de agua fue la primera habitación disponible en la lista. Ahora, hagamos las pruebas. Y a veces es difícil ver son recordar cuál siempre puede simplemente hacer clic en la garrapata y decir ejecutarlo. Está bien, así que solo haremos una construcción de proyecto como siempre. Y luego puede ver piso de estadísticas y ven aquí que está fallando. Entonces fue ése. Por lo que dice que en base a masa o Sean engañado reserva ID de habitación debe ser una bala era 0. Entonces eso es lindo. Una linda ballena inglesa viendo ¿cuál es su mal o su derecho? Debería ser uno pero era 0 y eso está bien. Eso se espera porque aún no hemos puesto nada en su lugar. Entonces esa es la modificación a la prueba. Vamos a saltar al procesador, se puede quitar ese punto de ruptura. Y entonces lo que vamos a ver aquí es si hay alguna habitación disponible, que sabemos de una vez que está ejecutando la prueba, habrá al menos una. Entonces me gustaría ver, consígueme el primero en las listas de nuestra habitación es igual a habitaciones disponibles. En primer lugar, el primero de la lista. Y luego voy a tomar este método call porque sí, necesito el objeto de reserva de habitaciones, que realmente está haciendo un trabajo fantástico de todo esto. Pero al final del día, también necesito poner en el nuevo ID de habitación, que estaría aquí. Entonces voy a decir que me des la habitación buscando peticiones por sí misma. Por lo que var reserva de habitación es igual para crear la habitación buscando objetos. Y luego reserva de habitaciones dot room ID es igual a la habitación que tenemos. Ahí vamos. Y luego ahorramos o buscamos habitación. Está bien. Entonces con todo eso, Helen y déjame volver atrás y volver a ejecutar las pruebas. Y ahora tenemos verde. Tan ocupado a veces los requisitos que entran ya se pierden algo. Podría tener que hacer un adenda a una prueba existente y te metes todo como necesites. Entonces eso es realmente todo para esta actividad. No hay mucho que refactorizar, nada en absoluto que refactorizar. Acabamos de modificar cuál de las aserciones y modificar el código para asegurarnos de que esta aserción sea verdadera. Y eso es realmente todo. Acaba de modificar nuestros datos de prueba y este requisito no se cumple. 14. Prueba y implementación: retratar el resultado exitoso o: Muy bien, entonces nuestra solicitud está bajando muy bien. Hemos estado revisando todas nuestras tareas a medida que avanzamos. Y así tenemos unas cuantas capas. Entonces en el que vamos a estar trabajando no es retorno éxito inundación de resultados. Muy bien, Así que cada vez que enviamos una solicitud con los resultados que se devuelven del código, necesitamos ver una flor en cuanto a si fue exitosa o no. No, saltando a la prueba, ya hice el trozo del método. Y antes de avanzar más, voy a mostrar, ya sabes, el concepto de pruebas impulsadas por datos. Por lo que las pruebas impulsadas por datos nos permiten realmente, en lugar de burlarnos y poner en escena datos dentro del método, realmente podemos poner en parámetros y luego podemos alimentarlos. Por lo que el primer paso para una prueba impulsada por datos es no usar el libro para usar la teoría. De acuerdo, así que esa es nuestra nueva anotación. Y entonces tenemos datos en línea, que luego nos lleva muchos parámetros como estaríamos proporcionando para la prueba. Entonces en esta situación, queremos probar un escenario donde tengamos una bandera de éxito. Y podría extender esto y decir éxito o fracaso inundación. Muy bien, porque queremos indicar si la reserva fue exitosa o no, y estaré usando una enum para esa constante. Por lo que podría decir reserva, éxito, bandera. Y el tipo no existe los todavía, esos hacen eso. Y el siguiente parámetro sería, está disponible. Entonces vamos a querer saber, ¿es la inundación este valor? Cuando es ese valor. Entonces más o menos esos son los datos que vamos a querer son el escenario que queremos posicionar se basa en estos dos valores. Entonces, antes de seguir adelante, déjame simplemente crear esto. Simplemente crearé eso en modelos. O podrías crearlo no domina, o podrías crear otra carpeta. Creo que solo crearé otra carpeta y llamaremos a esa una enums. Algunos saben con certeza si esos van a ser. Y entonces sólo voy a añadir una nueva clase llamada la reserva de bandera de éxito en eso. Pero en realidad es una enum pública. Y esta enum va a tener a Lo que es el éxito y el fracaso. ¿ Todo bien? Entonces es una vez más sólo cosas como el mar. Fue un éxito de reserva o fue un fracaso de reserva. Muy bien, Entonces no, puedo saltar para probar e incluir la referencia faltante para la enum. De acuerdo, así que para los datos en línea, puedo ver reservas, éxito, bandera, fracaso, coma. Entonces debe ser fracaso cuando esto es falso, ¿verdad? Si no hay nada disponible, entonces eso debería ser falso. Y entonces puedo ver el éxito cuando esto es cierto. Por lo que estos están presentando escenarios de datos, por lo que la prueba de antemano. Entonces cualquier código que lo escribamos automáticamente inferirá los escenarios en función de lo que estamos proporcionando aquí. Y por supuesto, los parámetros proporcionados en los datos en línea irán de acuerdo con los parámetros todos alineados para el método. Entonces para la prueba en sí, solo voy a escribir código que sea lo suficientemente genérico para cualquiera de los escenarios. Si quieres probar cuando esto no está disponible, voy a querer despejar mis habitaciones disponibles, ¿verdad? Por lo que este es nuestro dato de prueba. Y por supuesto si estoy probando para cuando no está disponible, entonces quiero replicar esta línea. Entonces, vamos a ver. Si no está disponible. Después llevar a cabo esta directiva. Despejen las habitaciones disponibles. Está bien. Entonces voy a decir resultados var, que sabemos que recuperamos cuando llamamos a nuestro procesador. Reservar la solicitud. Entonces solo voy a copiar y pegar esa línea. Sabemos que devuelve nuestros resultados. Por lo que apenas nos ponen a prueba son situaciones en las que no tuvimos que conseguir los resultados por nuestras aseveraciones y hubo situaciones en las que tuvimos que conseguir crédito. Eso está bien. Por lo que en esta situación, var resultado es igual para llamar a la solicitud. Y luego voy a ver que el, el punto de inundación de éxito de la reserva debe ser y debe ser en cualquier punto igual al código. Por lo que r para inundar el centavo por resultados. Entonces bandera aún no existe, así que solo voy a Control dot dejar que genere la propiedad dentro de esa clase de resultado para nosotros. Y entonces lo que podemos hacer es saltar por ahí y cambiar esa propiedad y asegurarnos de que sea lo que esperamos que sea. Y ahí está, bandera pública de éxito. De acuerdo, entonces eso ahora es parte de los resultados. Puedo ver que la prueba va a inferir o afirmar más bien que en cualquier momento, sin importar cuál sea la situación con la que se esté presentando. Si no está disponible, despejamos y luego tratamos de obtener el resultado. Por lo que el éxito de la reserva debe ser igual a eso. Lo que sea que se proporcione en este filo debe ser conforme a lo que se devuelva de los resultados. Entonces solo haré una compilación rápida solo para asegurarme de que todo esté bien. Y una vez que puedas verificar eso, solo correré esto. Y el explorador artístico nos deja saber que eso falló y eso está bien. Entonces si te das cuenta cuando caí sobre esta zanahoria, está mostrando dos pruebas anidadas bajo el único método stub, ¿verdad? Mostrando el primer escenario de prueba. Entonces el primer escenario, que es el escenario donde debe devolver el éxito. Entonces por defecto no he hecho nada pero el valor enum siempre va a default al primero dice impago al éxito. ¿ Todo bien? Y entonces el escenario de fracaso no se está llevando a cabo porque se ve aquí reserva bandera de éxito debe ser éxito. Ambos fueron fracasos, ¿verdad? Por lo que ahora necesitamos poner en código para asegurarnos de que todo eso funcione. Entonces en nuestro procesador, Ahí vamos. Tenemos que apuntalar un poco más esta afirmación si. Por lo que más o menos tendría que hacerle saber que el resultado, recuerda, devuelve los resultados. Entonces vamos y construimos los resultados manualmente. No oigas. Bueno entonces acabamos de añadir esa inundación. Entonces necesitamos poder determinar cuándo debe ser el flujo, qué valor, ¿verdad? Entonces voy a, en lugar de regresar ahí mismo, voy a construir el resultado de o a alguien a quien decir resultado es igual. Porque independientemente del resultado, sabemos que un resultado necesita tener estos valores. Entonces sabemos que mover este refactor no debe jugar un papel enorme en hacer que el código se comporte de manera diferente. No obstante, en el momento en que una reserva está a punto de guardarse, sabemos que después de haber sido guardada, puedo ver que el indicador de punto de resultados es igual a reserva, éxito, éxito. ¿ Todo bien? Y así, entonces si hay alguna habitación disponible, hacemos lo que hicimos antes y ponemos la bandera. De lo contrario, vamos a decirle que falló. Entonces el éxito, lo siento, la bandera lo sabrá, dicen fracaso. Está bien. Llamar a esta bandera de éxito de reserva es algo engañoso. Entonces voy a cambiar eso. Entonces en lugar de reservar con éxito, lo llamaré bandera de resultado de reserva. Eso es más genérico. Por lo que este control puntea y deja que actualice todas las referencias por todo el código. Y eso se ve mucho mejor. Por lo que al finalizar esta operación, acabaremos de devolver el resultado. Entonces construimos los resultados desde temprano y luego hicimos nuestra lógica empresarial. Y luego pongo esto después de lo guardado porque si este campo entonces claramente eso podría haber sido un éxito. De lo contrario fue un fracaso. Y luego vamos adelante y le devolvemos el resultado. Entonces si vuelvo a ejecutar esa prueba y lo voy a hacer desde el talón medio, entonces me estoy poniendo garrapatas verdes por todas partes, bien, agradable y fácil. Entonces a medida que ponemos en nuestras pruebas, implementamos, y lo más importante es el hecho de que podemos hacer teorías o pruebas basadas en datos donde proporcionamos los escenarios. Y en lugar de escribirte declaraciones para decir si esto entonces que si esto entonces esa estadística, un montón de cosas podemos escribir una prueba que encajará en los diferentes escenarios que esperamos salir de nuestro método. 15. Prueba y implementación: agrega Id de reserva a un resultado: Por lo que estamos de vuelta para otro ejercicio y en esta ocasión sólo queríamos añadir el ID de reserva de habitación al resultado. Por lo que hasta ahora tenemos la identificación de la habitación siendo agregada al resultado, es decir, sí, reservé esta habitación. obstante, no queremos tener el DNI para el registro que se ha reservado. Está bien. Eso está bien. Por lo que ya tengo mis métodos. Noten ninguna anotación porque realmente quiero que esta sea impulsada por datos. Entonces voy a tener dos parámetros. Voy a decir una habitación, reserva, ideas, un entero. Y en base a si hay algo disponible que ese valor podría cambiar, ¿verdad? Entonces voy a hacer lo mismo aquí donde tengo Boolean está disponible. Entonces voy a reutilizar mi teoría. Y sólo voy a copiar y pegar los dos en líneas. Lo que obviamente el inicio de sesión de datos. Entonces digamos lo que nos permita ver lo que sucede. Esperaría que tal vez una identificación de uno sería por lo tanto el ID de reserva de habitación cuando es cierto que algo está disponible. No obstante, si no hay nada disponible, ¿cómo esperaría nada para el valor ID? Y esto sería falso. Ah, me encanta el cambio mi tipo de datos aquí porque estoy viendo nulo, pero esto puede tomar una nariz después de hacerlo nulable, ¿verdad? Por lo que van a dividir ahí nuestro signo de interrogación que lo hace nulable y entonces eso está bien. Entonces una vez más, por mi escenario, si no hay nada disponible, entonces despeje la habitación. Entonces para el escenario donde está disponible es falso, entonces borra la lista de habitaciones disponibles. De lo contrario, quiero configurar mi método de guardar. Entonces solo voy a saltar de vuelta a donde probamos para el tamiz. Ahí vamos. De verdad voy a pedir prestado esto. No voy a volver a escribirlo, sólo aburrido toda esa configuración. ¿ Todo bien? Y en lugar de todo lo que hice ahí, voy a guardar Booking dot ID. Por lo que me fui a agregar este parámetro ID a la clase de reserva porque obviamente no hay identificación para ello todavía. Y este DNI debe ser igual a lo que esté pasando en el ID de reserva de habitación, valor de punto. Está bien. Entonces solo controlaré puntos. Que genere esa propiedad. Y sé que tendremos la idea y la identificación de la habitación. Entonces si eres meticuloso, quizá quieras reorganizar esto y poner Idea por encima del ID de la habitación. Eso está bien, pero no hará que el código funcione más o menos. Es sólo una cuestión de legibilidad, pero eso está bien. Lo dejaré tal como está. Entonces esa es la configuración para la C cuando estamos probando para el escenario, cierto. Entonces si no está disponible aquí, las habitaciones, de lo contrario, sigan adelante y confíen. Espere a que esa ID sea igual al valor. Entonces después de todo eso se hace, también necesito hacer representación en el resultado para el ID de reserva de habitación. Por lo que necesito tener identificación de reserva de habitación int pública. Correcto. Ahora, nuestra OCT on assert en nuestro método de prueba será similar a lo que teníamos anteriormente donde estamos realizando la convocatoria de resultado, y luego estamos aseverando que el ID de reserva de habitación de los resultados debe ser igual a la reserva de habitación que ha sido pasado en. Ahora hay un problema aquí y se ve que en no contiene una definición para debería ser. De acuerdo, sabemos que eso no es cierto, pero creo que es solo un tipo de datos en cuestión porque este es un int nullable, mientras que éste es solo int. Entonces déjame hacer que el ID de reserva de habitación sea nullable. Y ahí vamos. Está bien. Entonces estoy haciendo que eso sea nullable porque en el caso de que algo no esté disponible, entonces el ID el ID de la reserva va a ser ID de reserva de habitación va a ser no de todos modos, ¿verdad? Entonces solo estoy haciendo nullable que un resultado sepa que no necesariamente tiene que tener un valor en cualquier momento. Entonces hagamos las pruebas rojas. Entonces déjame correr. No lo noté diciendo que hay dos escenarios que aún no se han corrido. Una vez más, estas pruebas se ven como pruebas múltiples dentro de una sola sesión. Muy bien, así que saltemos a nuestro código. Por lo que esto sería en el procesador de reservas de habitaciones y PR demasiado. Lo que vamos a hacer es anexar a esta área. Eso da como resultado puntos. ID de reserva de habitaciones obtiene el valor de cualquier identificación de punto de reserva de habitación se convierte. Está bien, entonces en ese punto se obtiene ese valor. Entonces ves que ese test.py estaba probando el cabezal de escenario nulo. Déjame saltar de nuevo a las pruebas. Por lo que fue analizando para el escenario nulo donde esto es nulo y eso es falso. Entonces eso realmente habría pasado esa noche Charlie, porque aquí no estamos sentados ningún valor para el ID de reserva de habitación. Es nulable. Y así null es automáticamente ser un centro es todo dot room booking ID en esta situación. Por lo que necesitamos asegurarnos de que éste pase. Entonces cuando volvamos y volvamos a hacer nuestras pruebas, entonces veremos que nos estamos haciendo la prueba verde. Está bien. Entonces conoce nuestra aseveración de que el ID de reserva de habitación, esa es su devolución siempre debe ser similar al valor que se proporcionó. Por lo que se proporciona al menos uno, entonces el ID de reserva de habitación está regresando como uno cuando el conocimiento siempre que se está volviendo como un todo. Entonces eso es bueno. Entonces déjame solo hacer una compilación y no tenemos nada más que hacer ningún cambio mayor, así que no tenemos nada que refactorizar demasiado. Entonces eso es todo por cumplir con estos requisitos. 16. Revisión de la sección: Muy bien chicos, así podemos marcar con confianza todas las casillas de verificación, jalar todas nuestras tarjetas que no lo hacen. Y vemos que para estos requisitos preliminares, hemos implementado pruebas y hemos escrito código, y tenemos buena cobertura de código para la funcionalidad central de nuestra aplicación. Entonces todo eso está hecho por ahora. Por lo que hemos completado pruebas unitarias para el núcleo de la aplicación. No, claro que hay mucho más trabajo por hacer. Cuando regresemos, tendremos que terminar las implementaciones para nuestros métodos de interfaz, porque claramente, aquí no pasa nada realmente. Y ahora mismo sigue en teoría. Pero el punto del desarrollo impulsado por pruebas es que en realidad se puede obtener una buena idea del diseño de la API, el diseño general de la aplicación o el diseño de lógica empresarial. Antes de que realmente te metas en la carne de lo que realmente necesita que suceda, puedes wireframe todas tus clases deben mirar y cómo se relacionan entre sí desde muy temprano. Entonces eso es lo que realmente hemos estado haciendo. Por lo que más adelante veremos conectar con la base de datos y escribir pruebas unitarias. Verificar que las operaciones de la base de datos se estén comportando como esperaríamos que lo hicieran, y luego escalar eso a probar la aplicación completa. Pero por ahora solo estafemos nuestros cambios. Y mi mensaje de compromiso está terminado núcleo de aplicación de pruebas unitarias. Podemos comprometer todo y hundirnos. Y cuando regresemos, veremos más actividades. 17. Proyecto de refactor para la capa de acceso de datos: Muy bien chicos, bienvenidos de nuevo. En esta lección, queremos caminar por los pasos para configurar nuestras capas de acceso a datos. Y esto va a implicar alguna refactorización y reordenamiento de nuestros proyectos. Si miras mi explorador de soluciones, verías que tengo algunos proyectos nuevos y algunos archivos están en lugares nuevos. Y voy a querer pasearte por ellos paso a paso. No quería hacerlo en cámara porque todos sabemos crear proyectos. Entonces solo te voy a guiar y puedes hacer una pausa y replicar a medida que avanzamos. Pero mientras solo mires a través y lo hagas paso a paso, no deberían tener ningún problema mayor. Entonces, empecemos con los nuevos proyectos que se añadieron. Agregamos el dominio Up, por lo que sala de aumento de volumen de puntos dominio, ese es su propio proyecto. También agregamos reserva de habitación hasta punto persistencia de ambos de estos, yo solo clases bibliotecas. Y si recuerdas, la habitación mirando hacia arriba sobre core era sólo una biblioteca de clase. Por lo que las mismas reglas que utilizas para gobernar la habitación haciendo volumen hasta el núcleo, puedes reutilizar esas para el dominio y la persistencia. Y luego agregamos otra sala de proyecto de prueba x unidad incrementando la persistencia de puntos. ¿ Verdad? Para que puedas seguir adelante y agregar esos tres proyectos a tu solución. Ahora en cuanto al reordenamiento de los archivos, lo que hicimos fue tomar la carpeta de dominio o servidor de archivos en la carpeta de dominio y colocarla dentro de los proyectos de dominio. Entonces me deshice de la carpeta no antes aunque. Por supuesto, cogí los archivos y los pegué dentro de los proyectos de dominio. Entonces recubrimientos tan fáciles como hacer clic en el archivo que quieras y tú usando Control X entra al proyecto quieras y diciendo Control V. Así que eso es todo lo que hice para cortarlos y pegarlos en el proyecto de dominio. El siguiente movimiento importante fue el movimiento de la base de reservas de habitaciones, ¿verdad? Entonces recuerda que teníamos la propia clase base de reserva de habitaciones, la carpeta de modelos. Saqué eso y lo puse en su propia carpeta en la clase de dominio llamada modelos base. ¿ Todo bien? Ahora, claro que eso molestaría mucho de lo que tenemos en su lugar porque los espacios de nombres tienen que cambiarse y tenemos que poner en uso adicional. Por lo que los cambios de espacio FirstName ocurrieron con los archivos que se movieron. Por lo que la habitación, la reserva de habitaciones y la base de reserva de habitaciones todo consiguió nuevo dominio. Lo sentimos, nombres de espacio de nombres en forma de reserva de habitaciones, dominio de puntos Para reserva de habitaciones y habitaciones, y luego reservar habitación esta habitación reserva hasta punto dominio modelos basados en puntos. Entonces con ese cambio, en realidad levantar algunos de los errores que se habrían esperado. Por lo que primero hay que dejar que este proyecto, ni que tenga un proyecto o una referencia al proyecto de dominio. Eso se puede hacer de una de dos maneras. O vas, uso Punto de control y en realidad verías esta adición para agregar la referencia del núcleo. Pero si querías tomar el asunto en tus propias manos, siempre puedes hacer clic con el botón derecho en las dependencias, agregar referencia del proyecto, y luego solo asegurarte de tomar el medio. Entonces una vez que esa referencia del proyecto está presente, ahora podemos controlar el punto y agregar las declaraciones de uso en cualquier lugar que se ofendió por el cambio, ¿verdad? Por lo que solo puedes ir a través de cada archivo meticulosamente y asegurarte de que estamos actualizando las referencias sobre los demás. Usa la tecla Control para limpiar a medida que voy. Y en nuestro procesador sabría que este sería un archivo muy molesto porque ahí es donde se llevó a cabo mucha de la acción. Entonces solo usa los puntos de control que están usando declaraciones. Y en cualquier lugar que no esté satisfecho. Simplemente punto de control, Puntos de control. Y con unos cuantos, debería ser, todo debería estar bien. Así que solo asegúrate de que tus espacios de nombres sean correctos y actualices todas las referencias a medida que avanzas en la prueba. Entonces estoy seguro de que vamos a tener unos pocos que necesitamos actualizar también. Por lo tanto, controla el punto y actualiza las nuevas referencias del espacio de nombres. Y con uno, todo está bien para mí en esta prueba. Entonces esa es la cirugía con el dominio. Está bien, para que puedas seguir adelante y configurar este presidente de persistencia y todo agregando una carpeta llamada repositorios, que está vacía, ¿verdad? No wearable para llenarlo. Haré eso juntos, pero lo haremos juntos. Pero para el contexto DB, lo que he hecho es agregar una referencia a Microsoft como Entity Framework Core dot SQL Server. Por lo que puedes o ponerlo en el proyecto para el XML o por supuesto usamos nuevos consigue solo tienes que hacer clic derecho. Vaya a Administrar paquetes NuGet y podrá navegar y buscar SQL Server e instalar esa biblioteca. Entonces una vez que tengas instalada esa biblioteca. Cuando estamos configurando nuestro contexto DB. Y todavía tengo algunos votos ofensivos aquí, no hay problema, Puntos de control y añadir las declaraciones de uso. Por supuesto, los proyectos de persistencia también necesitarán una referencia al proyecto de dominio. Está bien, así que una vez más, solo asegúrate de tener esa dependencia del proyecto. Entonces si el control Dot no sugería que es lo que quieres hacer a sí mismo, puede ir derecho a pegarnos por el resto del expediente y ver qué hicimos aquí. Entonces uno, agregamos la referencia al uso para Entity Framework Core después dejar que nuestra sala pública buscando contextos DVI heredara de contextos DVI. Entonces tenemos a nuestro constructor. Y recuerda que un atajo para constructores, ver tina de alquitrán, tina épica falla porque ver TOR rematado ahí aunque. Por lo que siempre puedes hacer eso y generar tu constructor. Y dentro de ese constructor tenemos los parámetros DB, opciones de contexto sala de aumento de volumen contextos y opciones de Didi. Y luego tenemos que pasar esos a la base. ¿ Todo bien? No necesita ningún contenido. Solo asegúrate de tener ese constructor. Para nuestras mesas o conjuntos RDB. Lo que tenemos sería DB conjunto de tipo habitación para las habitaciones, DB conjuntos de tipo habitación de reserva para las reservas de habitación. Y entonces tenemos nuestro protegido sobre al vacío en modal creando ModelBuilder, ¿verdad? Entonces para este método donde religiosa anular un atajo para llegar a terminar con un poco para solo bucear anular y luego espacio. Y luego te da todos los métodos que podrías sobre es modelo de serotipado evidenciado, luego lo verás aparecer en la creación de modelos. Entonces eso es bueno que el método es saber lo que estamos haciendo dentro de ese método. Stub. Todo esto deshace todo eso. Lo que estamos haciendo en ese método stub es sembrar algunos datos, ¿verdad? Entonces solo estoy viendo ModelBuilder dot entity room tiene datos y luego solo estamos agregando tres habitaciones nuevas. Entonces verás que tengo identificación y nombre. Por lo que antes de este nombre no existía. Todo lo que teníamos en la habitación era identificación, así que solo puedes subir a la habitación y agregar ese nombre propiedad. No hay problema. Después de agregar esa propiedad de nombre, entonces puedes seguir adelante y darle un nombre. Se podría decir nombre, se podría decir descripción de lo que sea. Solo queremos algunos datos de muestra y ya sabes, para que se vea un poco más sensato, agrega un poco más como si nuestra aplicación se está uniendo. No, en cuanto a llaves foráneas, definitivamente necesitamos agregar una referencia de clave extranjera, que en la habitación y la habitación mirando al interior de la habitación will king could OS. Entonces sólo voy a reorganizar esto rápidamente. Voy a decir ID de habitación, pero también voy a agregar la propiedad de navegación de tipo habitación y llamarla habitación. Y esto serviría para hacerle saber que se trata de un periodo clave foráneo. Por lo que Entity Framework Core es lo suficientemente inteligente como para saber que se trata de una clave externa. Si quieres saber más cosas en profundidad, funciona un agujero de perno Entity Framework Core y cómo tu base de datos modelo es sutiles claves extrañas y así sucesivamente. Puedes consultar mi curso, Entity Framework Core, un recorrido completo. Por lo que no me pondré demasiado en profundidad con las configuraciones y todas las posibilidades de Entity Framework aquí. En cambio, nos sentaremos continuos sentados en nuestras capas de acceso a datos para que podamos empezar con nuestros proyectos, ¿verdad? Por lo que en este punto, quiero poner en el repositorio. Entonces ese repositorio, por supuesto, o tal vez debería llamar a estos servicios en realidad servicios de datos, ¿verdad? Y entonces podríamos renombrar esto a servicios de datos si lo desea. Es decir, hay tantas maneras en que puede renombrar. A veces nombras un nombre, un nombre, y luego te encuentras con problemas. Eso es lo que creo que lo voy a llamar repositorios. Porque realmente y verdaderamente, pesar de que lo llamaremos servicios de datos, realidad son solo repositorios para funciones. Y lo ha hecho, voy a añadir un nuevo archivo. Y solo estoy excluyendo el nombre ahí. Entonces voy a añadir una nueva clase. Y quería llamarlo servicio de reserva de habitaciones. Sólo con todo el yo, correcto. Añadamos eso. Y fui a conocer a esta clase pública y va a heredar del servicio de reserva de habitaciones i. Entonces eso significa que necesito una referencia de proyecto al núcleo. Y yo haré eso y la declaración de uso. Y entonces lo siguiente importante es que necesita implementar la interfaz. Muy bien, entonces ahora tenemos nuestros métodos de implementación. Por supuesto que tenemos el método aún comprado, no la implementación real, ¿verdad? Entonces, una vez más, si querías ver cómo ese margen de herencia te puede ayudar, verás los marcadores azules hasta escuchar a mi izquierda. Y si hago clic, puedo saltar al archivo principal. Entonces esa es una forma rápida de navegar entre archivos y su apariencia ya que estaba siendo de lo que están heredando, ¿verdad? Entonces eso es realmente todo para null para, para configurar las capas de acceso a datos. Bueno, una vez más, si necesitas revisarlos, hacer una pausa y pasar, ver exactamente en qué estoy de humor dónde y, ya sabes, podrías tener ligeras variaciones de algunos de los nombres que usaste para tu proyecto versus tu carpetas. Y eso está bien, ¿verdad? Siempre y cuando la idea general de por qué siempre dividir esto fuera esté ahí. Y es relativo al cambio. Es filosófico en el mejor de los casos. Pero mientras entiendas dónde estamos, lo que hay que ir y todo su varianza y obtener las referencias en lugar de que debería estar bien. Entonces los veré la próxima vez cuando leamos nuestra primera prueba de integración. 18. Prueba de unidades: recupera las habitaciones disponibles: Bienvenidos de vuelta chicos. Somos un audaz para leer o primeras pruebas de integración o prueba unitaria contra la funcionalidad esperada del Entity Framework. Por lo que ya estamos configuración o contexto DB y tendríamos configuración u otros proyectos en el proyecto de prueba, he creado un archivo aquí, pruebas de servicio de reserva de habitaciones. Para que puedas seguir adelante y agregar ese archivo de clase. Por supuesto, hazlo público. Y luego dentro de este archivo vamos a tener nuestro primer método. Por lo que es vacío público, debe devolver las habitaciones disponibles. Entonces por supuesto tenemos que decorarlo con nuestros atributos y en cualquier declaración de uso para que eso suceda. Ahora podemos iniciar nuestros arreglos. Entonces si volvemos a saltar a nuestro código para nuestro procesador, recordaría que para que obtuviéramos las habitaciones disponibles, necesitábamos pasar en la fecha de reserva de solicitud, ¿verdad? Entonces para que probemos contra la base de datos, tenemos que simular lo que necesitaría saber la base de datos si hay algo disponible. Por lo que primero venció el rango sería decir var es igual a saber el tiempo. Podemos simplemente poner en algún plazo de prueba, ¿verdad? Entonces voy a poner en la fecha de hoy que es 2021, 0 seis coma 09. Está bien, y luego voy a guardar nuestras opciones. Entonces la cosa es que sin duda causamos necesitamos una instancia de nuestra base de datos. Vamos a tener que inicializar las opciones que podemos pasar al contexto de la base de datos. Entonces recuerda que ese es nuestro contexto tiene el constructor que está buscando algunas opciones, parámetro de tipo db context options y relativo a la sala buscando contextos EV, ¿verdad? Entonces solo digo que las opciones var son, puedes ver opciones de DB o opciones de contextos sobre lo que necesitas para nombrar esto. Por lo que voy a decir var opciones DB es igual a una nueva instancia de nuevo constructor de opciones de contexto DB relativo a la reserva de habitaciones hasta contextos DVI. Y tenemos los paréntesis y agregamos punto, usamos base de datos en memoria. Ahora, en el camino van a tener que sumar algunas referencias mientras, y vas a tener que sumar referencia de proyecto a la persistencia, ¿no? Entonces una vez más haces clic con el botón derecho en dependencias. Adelante y agrega persistencia. Y otro que vas a tener que agregar es uno a Entity Framework Core en memoria, que puedes obtener a través de NuGet. Así que simplemente haces clic con el botón derecho en mucho dinero y obtienes paquetes. En realidad puedes simplemente buscarlo en la memoria. Y deberías encontrarlo con bastante facilidad. Y al instalarlo y yo, obtienes todos los demás y a las bibliotecas Framework Core que se requieren. Por lo que solo puedes seguir adelante y agregar esas dos referencias. Y entonces deberías deshacerte de todas las líneas rojas que se encuentran aquí arriba. Por supuesto, tienes que asegurarte de tener la declaración de uso apropiada a medida que avanza. Entonces aquí estamos viendo usar base de datos en memoria, y esta es la base de datos que estaré usando. Una más serían las opciones de punto. Muy bien, entonces esas son nuestras opciones de DB que estamos construyendo para la base de datos en memoria, que solo existirá mientras sea necesario para llevar a cabo la prueba. De acuerdo, así que está bien. No, dentro del contexto del rango, igual. Queremos una muestra de contextos. Por lo que quería ver contextos VAR usando contexto var. Entonces esto es básicamente decir nos crea alcance donde se tiene un contexto siendo igual a una nueva instancia de nuestra reserva de habitación. Contextos de bebé, que recuerdan toma un parámetro de opciones, le doy las opciones que acabamos de crear, que es opciones DB. ¿ Todo bien? Y luego dentro de este bloque usando, lo vamos a sembrar con algunos datos temporales sólo para toda la vida de esta prueba. Por lo que quería decir contextos dot add. Y en realidad puedes simplemente agregar una nueva entidad de cualquier cosa que se reconozca, ¿verdad? Por lo que en versiones anteriores de Entity Framework Core, probablemente deberías ser contextos más específicos. El cuadro que serán habitaciones, Puntos impar. Pero entonces en las versiones más nuevas solo puedes decir contextos dot-dot-dot, y luego le das un objeto que conoce, sabe. Entonces tu habitación. Está bien. Adelante y agrega la referencia. Por lo que estoy agregando una habitación nueva y puedo darle un id igual a 1. A lo mejor si quieres, puedes darle un nombre. Y depende de qué tan granular o cuánto detalle quieras en la prueba. Entonces solo voy a decir habitación 1 y luego punto y coma. Para que pueda agregar tal vez tres de estos, ¿no? Shin de ellos en consecuencia. Entonces esas son las tres muestras que estoy agregando. Y luego voy a sumar a reservar registros para nuestras habitaciones. Entonces por ello a Dan 14 el día anterior. De acuerdo, entonces contextos dot-dot-dot, ID de reserva de habitación nueva es igual a uno. Por lo que esa habitación fue reservada en las fechas que hemos preparado. Está bien. Y luego la habitación de al lado estaba reservada el día anterior o el día siguiente, cualquiera que sea el valor que quieras hacer. Pero para el de hoy, sólo uno debería serlo. Ese es el escenario que estoy creando. Por supuesto, depende de ti. ¿ Qué quieres hacer en tu escenario de prueba, verdad? Al final de todo eso, sólo vamos a hacer un contexto dot save cambios para asegurarnos de que la base de datos obtenga los datos comprometidos con ella. Y notarás que me deshice de los tirantes rizados, ¿verdad? Por lo que el editor sugirió que solo usamos puntos de control e hicimos la sugerencia y cambiamos esto en una declaración de uso para el contexto. Y entonces podemos seguir adelante y escribir todo nuestro código. Por lo que eso realmente lo resume para el rango del plomo contexto DB también tienen que organizar un objeto del servicio o un archivo de repositorio para llamarse servicio de reserva de habitaciones de bruja. Por lo que el servicio de reserva de habitaciones necesita poder hablar con la base de datos para poder llevar a cabo su operación. Por eso en el servicio de reserva de habitaciones, seguimos adelante e inyectamos este contexto. Si no estamos del todo seguros de cómo hacer eso, para que obtengamos al constructor CTO, nuestra tina, tina. Y luego ponemos en la incidencia de habitación mirando hacia arriba contextos DVI, contextos , y luego puntos de control. Asignar el campo y crear. Ahí vamos. Y luego usa el subrayado, solo la clave llamada consistente. Y eso es todo lo que hay es el inyectivo. Entonces no, a pesar de que los métodos aún no están implementados, sí tenemos una manera de hablar con la base de datos a través del contexto. Entonces en nuestro arreglado y todo, tenemos que inicializar una instancia de este servicio. Déjame calificar ese servicio de reserva de habitaciones. ¿ Verdad? Y el servicio de reserva de habitaciones es igual a una nueva instancia de la clase fuera del mismo nombre, servicio de reserva de habitaciones, que quita el parámetro de los contextos, que en este caso son nuestros contextos DVI en memoria. Entonces ahora hemos terminado de arreglar, es hora de que lo hagamos. Por lo que para nuestro primer acto, tendremos var, habitaciones disponibles siendo iguales a nuestra habitación, servicio de reserva, punto, obtener habitaciones disponibles. Y sólo pasaremos los datos que preparamos. Entonces en todas las habitaciones disponibles para eso. Simplemente un no ofrecido, es entonces por las aseveraciones, sea lo que fuéramos a hacer valer. Entonces en este punto, si quieres usar tu fluido, aseverar tus afirmaciones fluidas son deben poner nuestras aserciones por defecto, Eso no es problema. Es decir, ya verás en cómo funcionan todos. Entonces, um, o al menos ciertamente un assert, el default assert funciona. Por lo que en este punto, puedes sentirte libre de usar el con el que te sientes más cómodo. De lo que voy a utilizar la aserción por defecto esta vez. Por lo que fui a afirmar que el cono de la habitación, de las habitaciones disponibles para esto, debería ser el número X. ¿ Cuánto dinero crees que debería ser? Entonces en base al escenario que presentaste, tu probablemente tenga una aseveración diferente a mí. Pero creo que deberían ser dos, ¿verdad? Porque, y entonces esto va a sugerir que un swap los argumentos, ¿no? Entonces para igualar a eso. Por lo que estoy aseverando que debe ser al menos dos porque tengo habitaciones de uno a tres y la identificación de habitación con uno está reservada para que sea habitación ID 2 se reserva para el día anterior, y la habitación ID3 no tiene ninguna reserva de acuerdo a la base de datos. Por lo que al menos dos habitaciones deben estar disponibles. Si bien las aseveraciones que podemos hacer serían asegurarnos de que las habitaciones que esperamos estar disponibles estén contenidas en la lista, correcto. Por lo que podrías hacer valer las cantinas. ¿ Cuáles son nuestras habitaciones disponibles? Y entonces contiene no diría dame el tipo de datos, lo que se espera y después dime ¿qué esperas ver en él? De lo que estas sobrecargas solo están mostrando cuatro cuerdas, ¿verdad? Entonces aquí está, aquí hay uno mejor. Por lo que la tercera sobrecarga realmente muestra para una innumerable colección. Y luego se necesita un predicado R, una de esas expresiones Lambda como filtro para las comparaciones. Entonces, en otras palabras, diría lambda expresión Q, que representa cualquiera de las habitaciones disponibles. Podría decir que la identificación debería ser también, o al menos las habitaciones disponibles deberían contener algo con la ID dos. ¿ Verdad? Yo podría hacer lo mismo por los tres. Y yo también podría aseverar no contiene el asegurado que no contiene ID con uno justo aquí. Número de cosas que puedes hacer en este punto. Si quieres, lo hace, lo siento, es supongo un nombre que podrías haber afirmado contra el nombre. Entonces depende de ti, pero eso sí artista en este momento para asegurarnos de que tengamos habitaciones disponibles. Y una vez más, estamos involucrando pseudobase de datos glucosa están creando la base de datos, arreglándola, sentada arriba con algunas cosas de muestra. Y entonces estamos actuando en aseverar. Entonces, hagamos esta prueba. Y sabemos por saber que nos van a leer. Pero al menos lo ejecutemos y asegurémonos de que nuestra sintaxis sea correcta. Y cuando saltamos a explorador artístico, vemos todas las garrapatas verdes anteriores, pero luego vemos que tenemos un nuevo proyecto de prueba y es realmente conocido por nuestra nueva prueba, que nos está dando a nuestro sistema excepciones no implementadas. Entonces eso está bien. Entonces, al menos sabemos que en realidad está llamando a nuestros contextos. Perdón, es llamar a nuestro servicio, a nuestro repositorio. Y todo está bien en ese frente. Entonces supongamos, una vez más, caminar por cómo arreglamos y actuamos y afirmamos para esta prueba en particular. Porque aunque es un tipo diferente de prueba, esta es una prueba de integración donde estamos involucrando una configuración que tiene a los que se burlan de nuestra puesta en escena. Usemos la puesta en escena naranja donde no hay sistema de puesta en escena, eso es un sistema de terceros porque esto, mientras que el contexto existe en nuestra base de datos, EF Core es una biblioteca de terceros. Por lo que en realidad estamos escenificando lo que haría esa tercera biblioteca de terceros en una circunstancia normal con nuestra base de datos regular realmente estando conectada. Todavía no tenemos eso, así que podemos fingir usando el en memoria, dándole ese nombre. Entonces podemos decir, vale, usar la base de datos en memoria, lo llamó así por ahora y construir esas opciones y en el contexto que nos da e, por supuesto, tan versátil que una vez que construimos opciones, tenemos diferentes extensiones . Podemos usar opciones SQL, puedes usar opciones PostgreSQL. En este caso, estoy usando en la memoria. Y algunas personas usarían opciones de luz SQL, ¿verdad? Entonces el hecho es que construyes las opciones y los contextos creadores. relación con esas opciones, robas los datos que necesitas en la base de datos para este contexto, para esta prueba. Y luego eucariotas, protistas como si estuvieras probando contra datos reales que deberían existir. Entonces es como un pequeño paso adelante de solo crear una lista, ¿verdad? Entonces esa es nuestra prueba roja para esta actividad. Cuando regresemos, implementaremos nuestro núcleo. 19. Implement: recupera las habitaciones disponibles: Muy bien, chicos. Por lo que acabamos de escribir o leer pruebas para nuestras habitaciones disponibles, llamadas las habitaciones disponibles. Y ya escribí el código y lo hice solo para que podamos pasar juntos. Pero por eso ves que ya tengo una garrapata verde. Pero por array, he deshecho los cambios. Entonces voy a correr de nuevo y hacerlo prueba roja. Y ahí vamos. Entonces estamos en paridad nula. Entonces veamos cómo podemos implementar esta cotización. Entonces estamos llamando al método obtener habitaciones disponibles. Cuando I Control y F 12 va a saltar y vas a ver la excepción no implementada, que es de lo que se está quejando esto, y eso está bien. Entonces nuestra expectativa es que cuando llamemos a este método, le demos una fecha, vaya a devolver reglas que actualmente están disponibles dados los datos que se están solicitando. Entonces, ¿qué necesitamos para regresar aquí? Tenemos que asegurarnos de que escribimos una consulta que va a ser reflexiva de los datos que se esperan. Por lo que puedo decir var, habitaciones disponibles es igual a nuestro contexto, habitaciones puntos. Entonces puedo mirar en la mesa de habitaciones y luego obviamente necesito un filtro donde lambda expresión, ¿cómo conseguiría la habitación? Entonces tengo dos opciones. Probablemente podría mirar en el yo podría buscar en las reservas de habitaciones. Australia, la reserva de habitaciones estable, donde el ADN es equivalente al dígito actual. ¿ Verdad? Pero entonces ¿cómo sé si tengo suerte en el establo de reserva de habitaciones? ¿ Cómo sé qué mesas no son? ¿ Verdad? Entonces supongo que podría seleccionar la habitación en sí. Entonces Q punto, punto. Sí, sí tenemos la habitación, así que no, sé qué habitaciones están reservadas. Por lo que debería cambiar esto a en discos disponibles. Entonces en realidad estoy haciendo esto. Esto es como mi proceso de pensamiento habitual al escribir consulta más antigua, ¿cuáles son los, qué es lo más fácil derivamos la expresión lambda para obtener los datos quiere bien? Por lo que fácilmente puedo encontrar las habitaciones no disponibles, pero no, necesito encontrar las disponibles. Por lo que puedo decir var habitaciones disponibles es igual a las habitaciones de punto de contexto, puntos donde la expresión Q lambda, Q dot ID de la habitación son más bien, diría dónde en habitaciones disponibles. Por lo que hicieron esta lista. Está bien. Por lo que en las habitaciones disponibles no hay lista. En segundo lugar, vea donde la lista de habitaciones disponibles dot contiene el ID de habitación actual es equivalente a false. En realidad estoy haciendo esto a propósito. Te estoy mostrando lo más complicado donde probablemente ya te diste cuenta para poder escribirlo fácilmente y si te los tienes kudos, no hay problema. Solo te estoy mostrando cuál podría ser el proceso de pensamiento. Algunos Seing me consiguen las habitaciones donde las habitaciones no disponibles contienen eso. Entonces en realidad escribí igual a falso por legibilidad, pero también podría no ser continuo, ¿verdad? Pero para fines de legibilidad que interactúan o lo equivalente a falso. Está bien, y luego lo sacamos como lista. Entonces si hago eso y luego devuelvo las habitaciones disponibles, entonces teóricamente habría conseguido lo que no está disponible, luego telefoneé a todas las duras todas las habitaciones, lo que está disponible viendo las. No está contenido en la lista de no disponible, entonces por favor devuélvala y lo estamos devolviendo. Entonces voy a ejecutar esta prueba y ver si este bit de código funciona. Y cuando miramos nuestra prueba, vemos que estamos recibiendo luces verdes. Sí funciona, ¿verdad? Entonces como hemos estado haciendo, probablemente escribamos el código de una manera que hagamos que pase la prueba. Y entonces decimos, ¿cómo podría el yo refactorizar este código para hacerlo un poco mejor o lo que sea, por la razón que sea. Entonces para mí, esta es dos base de datos porque esta es una para conseguir lo que no está disponible, entonces quiero comprobar si la tabla tiene algo apagado los watts no está disponible. Y luego devolviendo el saldo, ¿verdad? Todo esto es realmente porque podríamos haber establecido ciertas propiedades de navegación dentro de las habitaciones, están dentro de nuestras clases para cumplir esto más sencillo. Por lo que las reservas de habitaciones ya tienen una obligación. Propiedad cuatro habitaciones. Entonces así es como conseguimos esa llave extranjera son, eso es lo que vamos a usar la inferir que hay una relación de clave extranjera entre la habitación y la habitación. Y eso está bien. Ahora si lo estamos viendo es en el nivel del tipo de relación. Es realmente un uno-a-muchos, lo que significa que la habitación ganada va a tener muchas reservas. Entonces sí, ahí tenemos la relación clave extranjera. Pero entonces en la habitación tengo la oportunidad y solo estoy pasando por esto en caso de que no estés tan familiarizado con Entity Framework Core, tenemos la oportunidad de realmente decirle a la sala que puede esperar tener una colección. Y solo voy a usar listas de reservas de habitaciones. Por lo que cualquier habitación puede tener múltiples reservas. Está bien. Y cuándo llamarlo reservas para representar que es una colección. Por lo que una vez más, Entity Framework, sólo inferimos que una habitación, muchas reservas y una reserva a una regla. Está bien. Eso es todo lo que tenemos ahora mismo. Eso está bien. Por lo que dentro de la consulta, puedo reorganizar las subredes. Porque en mi mente, podría decir regresar o dejarme sólo decir conseguir las habitaciones disponibles. Puedo decir var habitaciones disponibles es igual a las habitaciones de punto de contexto son. Permítanme simplemente duplicar esta línea. Está bien, y algo así hacerlo desde cero para que podamos ver todo pasando. Solo te estoy mostrando todas las opciones. Entonces no es necesariamente que uno funcione mejor que el otro. O sea, si vas a llamar nuevo costo de ir a la base de datos más de una vez como mejor que bien. Al final del día está pasando la prueba. Es sólo que el código podría escribirse de una manera diferente de hacer una base de datos llamada tan var habitaciones disponibles en esta nueva declaración. Var habitaciones disponibles, sí, es igual a contextos puntos habitaciones somos, y luego mi expresión lambda aquí tendría Q punto a través de reservas. Está bien, así que ahora tengo la propiedad de navegación para la reserva de habitaciones. Entonces automáticamente Entity Framework solo diría, estoy mirando para cualquier habitación, se pone todas las reservas que están ahí que puedo ver cualquiera en esta colección y amplitud en otras expresiones lambda, puedo ver donde hay alguna reserva que tenga la fecha de hoy o la fecha que se solicita, por lo que sí fue igual al bit. Está bien, así que esa es una reescritura completa y esta línea sola o coloca, estas dos líneas. Por lo que en realidad podría quitar eso y luego simplemente regresar las habitaciones disponibles. Y luego si tú, si quieres escribirlo en aún menos líneas, podrías simplemente regresar desde el principio. No hace falta esa variable. De acuerdo, y voy a volver a hacer la prueba porque acabo de hacer un techo enorme OK, morir. Condensado tres líneas de código en una sola línea de código. Y luego voy a permitir que mis pruebas unitarias me digan si mi refactor tiene sentido y está bien. Está bien. A medida que estoy recibiendo algunos comentarios, aseverar fracaso, está esperando a uno, Sólo es ver uno. Entonces mirando hacia atrás a esto, este es el problema que debí haber dicho es equivalente a falso, lo que significa que busco habitaciones disponibles, ¿verdad? Así que tráeme las habitaciones donde tengan alguna palabra. Hay reservas con la fecha. Y entonces estoy viendo caídas ¿no hay reservas con la escritura, así que es más legible para ustedes. Entonces consígueme habitaciones donde no haya reservas con las escrituras que se soliciten. Entonces volvamos a ejecutar ese tejido. Entonces, una vez más, se ve lo rápido que obtuve retroalimentación de nuestro refactor, se puso demasiado celo. Anna dijo: Oh, puedo hacer esto en una línea. ¿ Fue en una línea, falló la prueba? No. Revisé mi única línea de código y me estoy haciendo una prueba verde. Por lo que una vez más, este es un proceso de desarrollo impulsado por pruebas. Escribes tu prueba, escribes tu código, refactorías, vuelves a probar, y ECL rápidamente. Estamos haciendo todo este tipo de desplazamiento por él. El motivo está tardando tanto es porque estoy tratando de explicar a medida que voy. Y probablemente mis monólogos están extendiendo la cantidad de tiempo dedicado a hacer esto. Pero solo quiero asegurarme de que estás apreciando el valor de cómo estas pruebas nos están dando retroalimentación en tiempo real en cuanto al rendimiento o la precisión más bien, fuera de nuestro código. 20. Prueba y implementos: guardar una reserva de habitación: Muy bien chicos, bienvenidos de nuevo. Entonces estamos entrando y lo que vamos a hacer es hacer nuestras pruebas de integración para asegurarnos de que realidad guarde los datos en la base de datos, ¿verdad? Tan similar a lo que hicimos por, o contextos para el debería devolver las habitaciones disponibles. Porque el contexto necesita vivir dentro de la vida útil de la operación. No vamos a hacer un arreglo global como lo hubiéramos hecho para la prueba anterior, lo siento, para el proyecto de prueba anterior donde agregamos el uno arange de todos modos, ponemos una instancia para todo. Entonces en este caso, el contexto es un poco fugaz y necesita existir dentro del contexto de la prueba. Entonces haremos lo arreglado de acuerdo, ¿verdad? Una cosa que podemos mantener segura nuestra repetición serían las opciones de RDB. Aunque. Una vez más, querrías mantenerlo un poco único. Entonces hazlo único dándole un nombre diferente, ¿verdad? Entonces voy a Nehemías y debería guardar las pruebas. Y después de sentarme en las opciones de DB, voy a crear una reserva de habitación de muestra requerida. Entonces solo voy a decir que estoy reservando habitación con el DNI uno en esta fecha. Y por supuesto que hay otros campos. Un buen relleno en el correo electrónico y el nombre completo. Bueno, no pondrías el DNI porque estamos a punto de ver si es un no proporcionaría el DNI, pero se puede poner en todos esos campos, pero otros lo mantienen simple y ponen en la sala ID y la fecha sólo por nuestras aseveraciones. De acuerdo, entonces ahora que tenemos eso, podemos pasar a nuestro otro. Tan similar a lo que hicimos arriba aquí con nuestros contextos DVI. Sólo voy a pedir prestada esa línea y luego voy a inicializar mi servicio de reserva de habitaciones. Está bien. Y después haberla inicializado, puedo decir servicio de reserva de habitaciones pensado guardar. Y estoy pasando en nuestra reserva de habitación que estamos ahorrando bien. Ahora después de haber pretendido salvar a ROTC del ni en memoria, hay una serie de cosas que podemos empezar a afirmar. Uno. Podemos afirmar que sólo un registro entró a la base de datos porque la expectativa es que incluso cuando hacemos nuestra aplicación, cuando llamamos guardar, sólo un registro debe leer el goin. Al igual que en su momento estoy poniendo en una sola reserva. Nunca debería tener que grabar. Por lo que en realidad podríamos simplemente recuperar las reservas viendo reservas var es igual a o contextos, Puntos, reservas o reservas de habitaciones. Listas de clasificación de puntos. Por lo que estamos consultando para conseguir MC, todas las reservas que actualmente se encuentran en la base de datos. Entonces podemos decir var king, este, el único que se supone que está ahí dentro. Y puedo hacer valer soltero. Está bien. Por lo que estoy aseverando que sólo debería estar regresando un registro. Entonces si pasas el cursor sobre un solo, verás que verifica que una colección dada contenga solo un solo elemento del tipo dado. Entonces voy a ver un sencillo viniendo de las reservas. Está bien, Así que aseverar singlet, pero también es devuelve ese tipo. Entonces es decir uno. Debe asegurarse de que sólo hay uno ahí dentro y voy a devolverle el. Entonces si falla aquí, entonces sabes que guardó más de una vez y probablemente tengas un error en tu código donde probablemente esté cometiendo más de una vez en el momento del CVE. Entonces después de que obtenemos el fin de semana de reserva o aseveraciones, derecha, Así aseverar punto igual y podemos empezar a comparar el registro almacenado, que en este caso es reservar con el registro original que habríamos enviado. Por lo que puedo ver assert equal room booking.com y booking, que es lo que acabamos de recuperar de esa colección dot dot. Afirman que estos dos son iguales. También aseverar el ID de la habitación es igual. ¿ Todo bien? Y como dije, podrías haber puesto en campos de datos para el correo electrónico y el nombre completo, y luego solo haces tus aserciones en consecuencia. Bueno, más o menos eso es lo que está haciendo nuestra prueba en el corazón de la misma por la caja fuerte. Y luego basado en las diferentes reglas de negocio que podrías tener. En este punto sin embargo, el servicio no necesariamente debe tener alguna regla de negocio que debiera haber sido cuidada desde el núcleo, lo que significa que no debe llegar al mar del ciclo justo pone en todas las validaciones para asegurarse que tenemos que conseguir ese fuego a menos que cumpla ciertas condiciones. Por lo que todas esas validaciones realmente deberían ir en el nivel central o en el nivel de lógica empresarial. Pero justo en este nivel solo estamos probando lo que el B2B debe hacer. Digamos que estás probando en ese punto es realmente sólo basado en el escenario del hecho de que estás llevando consulta de motor. Una vez que llevas a cabo esta consulta, estás obteniendo resultados como los que esperarías. No lo es. ¿ La consulta hace esto bajo esta circunstancia no lo son? Eso debe hacerse a nivel de lógica empresarial. Entonces hagamos nuestras pruebas, que sabemos que serán verdes, lo siento, se deshará adelantándome allá. Entonces es construir un proyecto y luego Test Explorer nos va a mostrar pruebas de lectura. Ahí vamos, porque aún no se ha implementado y eso está bien. Por lo que solo puedo hacer click, saltar a las pruebas. Y todos estos métodos son realmente hay que hacer es agregar la reserva de habitación al contexto y luego CVE, ¿no? Por lo que fui a reemplazar esto por contextos o contextos de subrayado, dot add. Y entonces sólo puedo decir que tenía reserva de habitación. Y luego subrayan los cambios de contexto. Y todo el mundo debe ser obviamente saber si vuelvo a ejecutar la prueba y sólo voy a correr. Está bien, así que ven aquí tiene cinco pruebas rodeando este método. Todos estos pasados, menos en el pasado, fueron buenas pruebas y este campo. Entonces solo voy a ejecutar todas las pruebas asociadas a este método de tamiz. Y veamos el viejo com. De acuerdo, entonces verás que un poco se saltó lo que no necesitaba volver a ejecutar, selecciona éste con ese blanco y verde. No se corrió esta vez porque no fue que las pruebas asociadas al CVE. No obstante, las cinco pruebas la política de Arnold incluyendo la que acabamos de escribir. Entonces eso es realmente todo para probar si Entity Framework va a ver el registro. Está bien, recuerda eso es lo que estamos haciendo. Estamos haciendo un agujero de prueba de integración. ¿ Interrumpe nuestra aplicación con el RM o la biblioteca que se encarga de hablar con la base de datos. Entonces eso es lo que tenemos unidad probada una vez más en trabajo diferente hace que sea tan fácil para nosotros simplemente girar una base de datos para artistas escenario y luego eliminarla después. Por lo que estas bases de datos solo existirán una vez que se esté ejecutando esa prueba. Entonces eso es realmente todo para nuestras pruebas de integración. Cuando volvamos, sólo revisaremos todo a nivel superior y luego avanzaremos. 21. Revisión de la sección: Muy bien chicos, así que eso es realmente todo para esta sección. Hemos agregado otro proyecto de prueba. Entonces vemos en nuestra solución tenemos bastantes proyectos y algunos de ellos necesitan ser probados. Algunos no necesariamente necesitan ser probados. No teníamos este dominio porque realmente es solo almacenar todos nuestros archivos de clase que más tarde se convertirán en las entidades para la base de datos. Habíamos agregado una persistencia que mangueará el repositorio o atenderá nuestro Servicio de Datos, lo llamo carpeta repositorios, pero estoy llamando a los servicios de archivos. Entonces podríamos llamarlo así. Podrías llevarla a cabo si tienes una convención de nomenclatura de botones, eso está bien. Pero el concepto es que la implementación del servicio de reserva de habitación ojo. Por lo que i servicio de reserva de habitaciones tendrá todos los métodos relacionados con datos talones menos. Y luego serán implementados por el servicio de reserva de habitaciones, que definitivamente tendrá el código concreto. Entonces, al menos cuando éramos unittest en el núcleo, realidad solo estábamos pruebas unitarias contra el servicio de reserva de habitaciones ojo. Nuestras aseveraciones donde supongo que el zorro de que el método habría recibido una llamada al menos una vez o nunca basada en la circunstancia. Entonces, por instancia, en las solicitudes de reserva de la sala de ahorro, ¿quién vería aquí que estábamos verificando que al método de guardar se llamara al menos una vez, verdad? Por lo que cuando se proporcionen los datos actuales, en base a la lógica empresarial que habríamos puesto en el procesador, ese método de servicio debería llamarse al menos una vez. Ahora, una vez más, el núcleo es donde implementamos y probamos la lógica empresarial, las reglas detrás cuando hace que cierto método llame a qué circunstancia se comporta una semana en particular, eso está bien. No obstante, el túnel de pruebas de integración se asienta debajo de la lógica empresarial donde estamos integrando o donde estamos probando los sistemas que estamos integrando con esta situación. Estamos integrando con nuestra base de datos a través de una biblioteca llamada Entity Framework Core. Entonces estamos probando para asegurarnos de que cuando llamamos a los métodos que realmente están haciendo el trabajo interdependiente o trabajo que en diferente núcleo de trabajo se esté comportando de la manera en que nos gustaría que se comportara. Muy bien, entonces eso es lo que es una prueba de integración. Y en este nivel tú, aquí es donde comenzarías a probar como cómo interactúas con un Conejo QR, MQ, ¿verdad? O jefe de servicio. Evaluarías interactuar con un servicio de correo electrónico, cualquier cosa que sea un tercero. Ahora no eres el correcto en las declaraciones de Oriente en el código directamente porque solo estás escribiendo código para interactuar con él, entonces ahí es donde comienzas a hacer tus pruebas de integración para probar cómo interactuo con él. Después de la interacción, ¿obtuve un resultado que esperaba? Entonces con todo esto hecho, pasemos a nuestro Git y un check in. Por supuesto, vamos a escribir un mensaje que sea indicativo del trabajo que se hizo. Y entonces sólo voy a seguir adelante y comprometerme todo y hundirme. Una vez hecho eso, podemos hacer una pausa aquí y luego pasamos a la siguiente sección. 22. Comprender las pruebas de unidades. Aplicaciones en la red Core: Muy bien chicos, bienvenidos de nuevo. En esta lección, vamos a estar configurando nuestro proyecto web y entenderemos por qué es importante probar unitariamente los proyectos web reales. Ahora para esta parte del mismo, quería estar usando una API web sin razón en particular se resolverá el hecho de que es un poco más fácil ver cómo probamos unitarios. No tenemos la sobrecarga de una interfaz de usuario ni nada por el estilo. Con API, podemos usar la prueba unitaria de los puntos finales con bastante facilidad. Pero dicho eso, los conceptos de pruebas unitarias, una API de núcleo de dotnet sería muy similar para las páginas de Razor up o una aplicación MVC. Las únicas diferencias reales serían los tipos de retorno porque dotnet Core es tan versátil que las entresijos entre los diferentes modelos son muy, muy minutas. Muy bien, entonces eso es, la consistencia es muy buena. Entonces sigamos adelante y creemos nuestros proyectos API. Yo sólo voy a añadir un nuevo proyecto. Y vamos a elegir API web Core. Si no lo tienes a la izquierda, siempre puedes buscar Core Web API son solo esa API. Pero una vez que encuentres la plantilla, lo que vamos a estar nombrando a ésta es la habitación que engloba esa API. Si quieres usar las páginas de Ariza no son aplicación MVC, lo pondrías wi, algo más, pero no son páginas NVC R-dot, sea lo que sea, quieres ponerle nombre. Pero como dije, demostraré usar la API para la sobrecarga más baja en general. Para que podamos seguir adelante y golpear Next. Y podemos dejar todo como está. Y ¿crea de manera similar a lo que habíamos hecho con los otros proyectos de pruebas. Simplemente vamos a seguir adelante y agregar un nuevo proyecto, que será un proyecto de prueba de x unidad. Será una habitación reservando mucho, pruebas api dot. Y entonces podemos usar eso y crear también. En este punto solo voy a seguir adelante y las dependencias bridgette. Entonces primero para la prueba fue, bueno, déjame empezar con la API. Por lo que para la API, definitivamente va a tener una dependencia de Bridget en la capa de persistencia y en la capa central. Para que puedas seguir adelante y sumar esos. Ahora no estamos dispuestos a avanzar mucho más allá de esto por ahora. En cambio, sólo vamos a ver los conceptos de por qué pondríamos a prueba unitaria en este nivel. Por lo que las pruebas unitarias se trata de encontrar bits y piezas de auto de su aplicación operarán en las ciertas circunstancias. Entonces, mientras más cobertura tengas, mejor en esta situación, ya tenemos cobertura para nuestro núcleo Up. Por lo que cualquier otro procesador o cualquier otra clase de lógica empresarial u operaciones que agreguemos, podemos probar unitariamente a ese nivel. Las pruebas de persistencia son a nuestra prueba, mantener las operaciones de base de datos con nosotros, y asegurarnos de que hagan lo que se supone que sepan cuando se agrega uno, él solo se agrega uno, etcétera. Ahora a nivel de aplicación, se trata más de ver cómo responderá la aplicación en las ciertas circunstancias. Entonces con cualquier aplicación web, cuando te dan entrada válida, esperas AS o una acción que se realice si te dan entrada inválida aquí esperando que se tomen ciertas acciones, ciertas cosas se pueden controlar desde el lado del código, no necesariamente la UI o las presentaciones del código detrás o la poca lógica que se ejecuta en segundo plano. Entonces algo así como codificar contra lógica inválida, entrada inválida, lo siento, por lo que el usuario ingresa los valores equivocados. Tienes validación que debería ver si no es válida, luego devueltos a pj se devuelven alguna forma de resultado en el caso de una API. Y si es válido, entonces la codicia directa a otra página o devolver cierto tipo de resultados. Entonces esas son las cosas que te gustaría probar unitariamente para todo este nivel de aplicación. Entonces si miramos el proyecto de muestra para la API, vemos que tenemos controlador de pronóstico del tiempo el cual tiene un endpoint que devuelve algunos resultados de pronóstico del tiempo tipo. Sepa que voy a mostrarles cómo sería exactamente una prueba unitaria para ese endpoint API o para el controlador en general. Entonces usando la prueba unitaria una clase que solemos eliminar, sólo vamos a escribir ese tipo de pruebas. En primer lugar, necesitamos nuestra dependencia del proyecto, se agrega para el proyecto API a los proyectos de prueba API. Entonces, adelante y haz eso. Y mientras estamos ahí, sólo tienes que seguir adelante y saltar a NuGet y vamos a tener que añadir la herramienta simulada, la biblioteca de candados también necesitará agregar seguramente. Por lo que ves en hola trabaja astutamente, ve en su conjunto la aseveración negativa dos x proyectos de unidad funcionan. Podrás hacer tus propias inferencias en cuanto a cuál prefieres. Eso no es problema. Pero voy a estar usando seguramente para este conjunto de pruebas. Así que instala, burla e instala, y luego salta a nuestras pruebas unitarias un archivo predeterminado Vine con nuestro proyecto, no lo he borrado. Podemos usar esto justo como una muestra para ver cómo este controlador de pronósticos meteorológicos obtendría pruebas unitarias. Entonces en nuestra prueba unitaria en archivo, Sólo escribamos un probador que es un deber. Regresar resultados del pronóstico. ¿ Todo bien? No, En mis declaraciones de uso que tengo usando no debería estar usando x unit y usando system.in. Concedido, conforme escribimos, los verán. Tienes la oportunidad de poner en lo que falta. Por lo que no tienes que necesariamente replicar eso ahora mismo. Pero a medida que avanzamos, se ve lo que tiene que pasar. Entonces, en primer lugar, necesitamos burlarnos del registrador que está presente dentro del controlador de previsión meteorológica porque tenemos este registrador siendo inyectado. Entonces para poder acceder al registrador, necesitamos un objeto de esto. Y al saber todo eso, simplemente nos burlamos de estas cosas a medida que avanzamos. Muy bien, Así que voy a tener que decir var logger Mach es igual a un nuevo Mock de lager relativo al controlador de pronósticos meteorológicos. Por supuesto, cualquier tipo que falte vas a necesitar la declaración simulada de uso de top una vez que escribas eso. Y entonces yo logger probablemente va a necesitar están usando declaración. Y entonces por supuesto, controlador de pronóstico del tiempo necesitará eso usando declaración también. Entonces sólo tienes que seguir adelante y Controlar puntos e incluir todas las referencias faltantes. Siguiente parada necesitamos inicializar o controladores. Entonces solo voy a decir que el controlador var es igual a una nueva instancia del controlador de pronósticos meteorológicos, que está tomando como parámetro objeto simulado registrador, igual que lo verías aquí. Estamos instanciando una nueva instancia de controlador de previsión meteorológica y dándole ese objeto registrador. Entonces ahora que hemos hecho todo eso, necesitamos cumplir con la Convocatoria. Sólo tiene un método que estamos probando nuestra justicia, que obtenemos sobre un resultado. Entonces realmente solo necesitamos llamar al get. Entonces para llamar al getter, voy a decir que el resultado var es igual al controlador dot gets. Entonces podemos hacer nuestras aseveraciones sobre lo consigue o sobre los resultados más bien. Por lo que puedo afirmar que puede ser resultado debe ser mayor que uno. Probablemente también podría afirmar que los resultados no deben ser nulos. Otorgado estos dos tipos de van de la mano. Si no es nulo, si el conteo es mayor que uno, entonces evidentemente no es nulo. Pero es posible que esto no sea nulo, pero los conos no están enraizados en uno, ¿verdad? Entonces, ya sabes, pones todas las aseveraciones, vemos que ponemos en todas las aseveraciones de que vamos a querer asegurarnos de que nuestro método está haciendo lo que esperamos que haga. Entonces estoy probando después del hecho en esta situación. Entonces aquí es donde ese tipo de división surge con pruebas unitarias porque a veces las pruebas unitarias son, se introducen después del hecho. Y entonces en ese punto no está claro qué exactamente debería estar haciendo valer relativo al código que ya está escrito, ¿verdad? Versus cuando escribes la prueba primero, y luego escribes la cita demasiado la prueba, entonces sabes exactamente como para como lo que tiene que suceder. De cualquier manera, intentemos ejecutar esta prueba y veamos si obtenemos buenos resultados. Y después de realizar esa prueba, veo que tenemos pruebas de acuerdo. Entonces tenemos una prueba verde por supuesto, porque prueba ya existe, son el código ya existe más bien. Entonces si hice algo como retorno null, digamos que ya sea refactor saber, y para, ya sabes, inadvertidamente introduje este retorno null en algún lugar de este método que va a sesgar completamente lo que debería volver, entonces nuestra prueba debe saber estar fallando. Y ahí vamos. Entonces ahora estamos viendo que estaban recibiendo otra excepción. Y esa excepción es más tener que ver con nuestra aseveración de que con el código en sí, Fred, está consiguiendo esa excepción de conocimiento porque he regresado nulo. Y esto es nulo. Por lo que no puedes encontrar los conos fuera de nulos. Se puede encontrar el número de nada, ¿verdad? Entonces déjame reorganizar esta aserción e intentarlo de nuevo, deberíamos ver un tipo diferente de época, menos error de excepción no desconocido. Y ahí vamos. Entonces en ninguna parte conseguir un mensaje diciendo que el resultado no debe ser nulo, comprado estuvo bien. Entonces esa es nuestra aseveración. Sepan que estoy viendo que no debe ser nulo. Por lo que se está deteniendo antes de que incluso esté llegando a este para sentir que nos está haciendo saber que los campos de aserción. Entonces ese es un ejemplo básico de cómo unitario probamos controladores o por r, por extensión, el proyecto web en el ASP.Net Core. Por lo que cuando regresemos, estaremos implementando nuestro propio controlador y pruebas unitarias o controlador propio con las pruebas unitarias más significativas o de contacto contextualmente apropiadas. 23. Configurar sqlite en la memoria: Hey chicos, bienvenidos de nuevo. Antes de ir más lejos con nuestras pruebas de nuestra aplicación web, quiero que configuremos el Datastore y le daré que esto es solo una obligación de muestra rápida y no voy a llegar tan lejos como configurar una base de datos completa de SQL Server para solo una o dos mesas, vamos a quedarnos con su infante. Vamos a usar una conexión SQL lite en memoria. Muy bien, así que en el archivo CSS de punto de inicio, saltemos por ahí. Y debajo de la implementación de swagger, podemos empezar diciendo cadena de conexión var, solo voy a llamar a la mía Khan. Cadena es igual a fuente de datos igual a colon, memoria colon. Muy bien, ahora si quieres más información al respecto, siempre puedes ver cómo conectarte a bases de datos en memoria SQL light en una aplicación dotnet Core, hay documentación sobre ella, pero no voy a entrar en demasiadas detalles, ¿verdad? Nulo. En su lugar solo seguiré con una cadena de conexión. Entonces diré var con, con. Nuestra conexión es igual a nuevo SQL I t0. Por lo que OCC SQL conexión ITE. Y luego pasamos en esa cadena de conexión. Entonces por supuesto que ya sabemos cada vez que vemos esos subrayados rojos, controlamos eso. Y luego ves aquí necesito un paquete para Microsoft dot SQL I dot core. Entonces seguiré adelante y buscaré e instalaré la última versión. Y cuando eso se haga, podemos continuar viendo abiertos puntos cónicos de Sean. Para que en ese punto abramos la conexión a la base de datos SQL en memoria. Entonces tenemos que dejar que los servicios y todo lo que necesitamos para sumar un contextos DVI. Y nuestro contexto DB será lo que la configuración en la capa de persistencia, que es nuestra habitación reservando el contexto DB, ¿verdad? Entonces es relativo a ese punto de control o no necesito punto de control porque tenemos en eso. Yo usaría declaraciones en pasta. Entonces cuando lo copié y pegué, ve que agregó automáticamente la declaración de uso para la persistencia. Por lo que les animo a usar mucho esa característica. Entonces le puedo dar algunas opciones. Donde voy a ver tu opción es usar SQL. Se, que sospecho que va a necesitar algún tipo de biblioteca. Pero hasta entonces voy a pasar en el objeto de conexión Puntos de control. Y eso no me ayuda. Pero yo simplemente no balazo a NuGet con este. Entonces voy a ir a New get for the web project. Y creo que voy a necesitar Entity Framework Core con TI SQL. Muy bien, Así que en la idea de SQL y obtuvo un montón de otros resultados, realidad es fácil escribir en Entity Framework Core, y luego verás dos puntos de trabajo diferentes SQL ITE dicen que puede seguir adelante y descargar e instalar ese paquete. Y luego volviendo a nuestro archivo de inicio, si hago Control lot, verás que aparecen las opciones de declaración de uso y entonces estamos en claro. Entonces así se van a ver los contextos RDB para nuestra aplicación web. Por supuesto, en un entorno real, tendrías una conexión de base de datos real que probablemente vivirá en la app settings.js on. Y luego te inyectarías eso. Si quieres saber cómo sucede eso, puedes gotear uno de mis otros cursos de puntonet core donde realmente usamos bases de datos reales. Pero solo por este escenario donde solo estamos mirando a TDD dentro de este contexto. No voy a ir tan contratado, sólo me conformaré con la implementación en memoria. Entonces sepan que eso se hace. Cuando volvamos, podemos empezar a configurar nuestro controlador y en realidad escondernos a algunas pruebas unitarias. 24. Crea escenarios de pruebas de unidades: Muy bien chicos, así que saltemos directo a escribir todas las pruebas unitarias para el controlador API. Entonces solo tenemos un control, como puedes ver, solo estamos haciendo una prueba de concepto con un arriba muy pequeño, pero estamos viendo las pruebas unitarias y los diferentes niveles. Por lo que esta API va a ser bastante simple. Simplemente va a tener bajo la API que necesitamos estar vinculados a medida que se mueven hacia el centro. Y luego vamos a permitir que el usuario reserve una habitación, quiere devolver un antiguo resultado clave con objeto de resultado como un todo cuando se llega a un objeto de resultado. Y queremos agregar validación y rechazar malas solicitudes. En nuestro código, hay pocas cosas que necesitamos hacer. Uno, crea este nuevo controlador para reserva de habitaciones. Así que lo llamé control de reserva de habitaciones. Si no estás tan familiarizado con las API, siempre puedes quitarte mis cursos de API. Pero si necesita saber cómo agregar este controlador aquí y no, haga clic derecho en la carpeta de controladores controlador glúteo, y luego golpee API y cree ese controlador vacío con el mismo nombre. Por lo que eso te dará estas plantillas básicas. En el mismo aliento. También puedes seguir adelante y golpear nuevo, crear un nuevo archivo de prueba de controlador de reserva de habitaciones en nuestra API para difundir o no cuándo mostrarte eso todavía porque tengo alguna coordenada. Bueno, vamos a pasar por eso juntos para que puedan crear ese archivo. Mientras tanto, lo que voy a hacer, sin embargo, es dirigirme a nuestros proyectos centrales y traer nuestro Servicio de Datos, o lo siento, no al Servicio de Datos o procesador. Ahí vamos. Entonces de la misma manera que teníamos nuestro servicio de reserva de habitaciones ojo y luego esos servicios de reserva de habitación ocular realmente solo Nikon obstruye, encima de nuestra capa de acceso a datos. Y entonces tenemos la implementación aquí. En realidad necesitamos que nuestro procesador sea inyectable. Entonces ahora mismo es solo el concreto, una clase que se crea una vez en solo lugar y se mueve por lo que entonces se ve es todo el camino aquí en el núcleo y necesitamos, está todo el camino aquí arriba en la API. Entonces lo que voy a hacer es dar click en la clase prensa de vapor Control dot. Y luego ves que tienes una serie de opciones. One-off el cual incluye Extract Interface. Entonces, cuando creas la interfaz antes de entonces, la clase heredadora necesita implementar esa interfaz. En este caso, ya creamos la clase, así que no, necesitamos la interfaz. Voy a golpear Extract Interface. Sí, quería saber nuevo archivo y ves que automáticamente dará ese archivo que yo espoleo la convención de nomenclatura. Y lo hará, puedes seleccionar y anular la selección del método que quieras ahí dentro, haces clic en Ok. Y entonces ahora tenemos nuestra, nuestra interfaz que implementa el procesador de solicitudes de reserva. Ahora esto necesita ser accedido por la APA. Entonces para que sea accesible e inyectable, tenemos que venir a nuestra startup. Y voy a solo remar, puedo hacer esto bajo el contexto db. Diré servicios punto, y podemos agregar alcance. Yo una vez más, si no estás familiarizado con la inyección de dependencia, se ríe uno de mis cursos de núcleo de dotnet, lo que estoy agregando alcance y voy a añadir el ojo room booking request processor junto a su implementación así que puede ser inyectado y utilizado por cualquiera de los controladores en nuestra API. Entonces eso es todo lo que se necesita, ¿verdad? Entonces saltemos al archivo de prueba. Entonces como dije, he escrito alguna cantidad de código, pero te voy a recorrer línea por línea. Siéntase libre de pausar, replicar. Pero te estaré explicando todo. Creo que son sólo un poco las cosas que debemos hacer entonces para que tú me veas tipear. Por lo que acabo de preparar es y luego te acompañaré a través de ella sin importar. Por lo que tengo todos los activos o al menos algunos de los activos como yo conocible, es una especie de preparado en la parte superior. Por lo que tengo mi constructor donde estoy inicializando un servicio de reserva de habitaciones para ser una nueva instancia del procesador de solicitudes de reserva. Tengo una instancia de mi controlador. Y recuerda que en realidad puedes simplemente escribir sobre esta tierra y luego usar punto de control para generar retroactivamente este método lo habíamos estado haciendo, lo siento, este campo. Lo hemos hecho un par de veces antes de esto. Entonces para el controlador, ven aquí eso es que estoy inicializando mi controlador de reserva de habitaciones y tiene una línea roja porque también le estoy dando el servicio de reserva de habitaciones. Objeto de pensamiento. Y esto probablemente me deje llamar a este procesador de reservas de habitaciones en lugar de servicio, ¿verdad? Sólo para ser explícito y claro con los nombres, procesador de reserva de habitaciones y refactor en el camino. Está bien. Por lo que el objeto simulado del procesador de reservas de habitaciones se está pasando al controlador de aspecto de habitación. Entonces desde aquí puedo hacer Puntos de control y dejar que genere ese constructor jumbo ahí. Y luego solo voy a renombrar estos proceso de solicitud de reserva de habitaciones o procesador de reservas de habitaciones. Con el guión bajo y uno sin. Así que conoce nuestro controlador tiene la instancia de la reserva de habitaciones solicita procesador que se inyecta y listo para usted. Eso está bien. De lo contrario tengo una instancia de nuestra solicitud y una instancia fuera de nuestros resultados. Ahora una cosa más que voy a hacer, y podemos hacer esto juntos es montar este Mach, ¿verdad? Entonces recuerda que este simulacro necesita saber que cuando se llama, qué debe hacer. Muy bien, entonces estamos haciendo la configuración. Vamos a establecer el punto x. Y en realidad sólo hay una sala de libros de métodos. Necesitarías un simulacro de biblioteca por supuesto. Y voy a estar usando debería vivir para mis aseveraciones, se esfuerza por por por si acaso no mencioné los anteriores, asegúrate de que vayan a NuGet e instalas estos dos paquetes. Ya lo hemos hecho antes. Y si no estás tan seguro, siempre puedes simplemente ir al proyecto de prueba anterior. Literalmente puedes simplemente copiar estas dos líneas. Acude a tu proyecto notado y pégalos ahí dentro. Y luego solo haz una compilación y automáticamente instalará esos paquetes para ti. Por lo tanto, armemos nuestra sala de libros. Por lo que nuestra sala de libros o requiere alguna forma de objeto de solicitud. Entonces le voy a dar nuestras peticiones aquí. Y luego necesita devolver alguna forma de resultados. Por lo que sólo voy a decir que las devoluciones de puntos son en realidad un tipo que está en su propio lugar que debería estar fuera de puntos retornos. Ahí vamos. Y lo que regresará es alguna forma de resultados. De acuerdo, así que sólo estoy dejando estos también. Están instanciadas, pero aún no tienen ningún dato útil en ellos. Eso está bien. Pero esa es nuestra configuración para nuestro procesador de aspecto de habitación. Ahora si bajamos un poco, verás que aquí tengo prueba multipropósito. Y esta prueba va a cubrir los escenarios de herramientas a partir de nuestro requerimiento. El requisito es que necesitamos permitir que el usuario reserve una habitación. Yo fui, es inválido. Rechazamos el intento. ¿ Está bien? Entonces tengo una teoría y tengo dos bits de datos, dos filas de datos para encajar. Entonces el primero está viendo que este es el número esperado de llamadas a métodos, que es uno. Cuando el modelo IS válido es verdadero y debe devolver el tipo de resultados de Objeto Clave Antiguo. Entonces el problema es que hay tipo esperado tipo de resultado axón. Entonces con las API, puedes regresar, bien, puedes devolver 404 o mala solicitud, etcétera. Entonces queremos asegurarnos de que cuando todo esté bien, obtenemos al menos una llamada de método a la sala de libros y podamos descartar que Kirk está encendido rápidamente. Perdón. Por lo que obtenemos una llamada de método a nuestra sala de libros. Y cuando es válido, y obtenemos eso, vale, los resultados de los objetos cuando no es válido, no queremos ninguna llamada de método y debería ser una mala solicitud. Por lo que esos van en línea con tres parámetros y el nombre de las estadísticas debe llamar método de reserva cuando sea válido. De acuerdo, creo que eso es bastante sencillo. Ahora para el arreglo, voy a obligar al estado modelo del controlador a ser lo que fuera Boston. Bueno, son verdaderas o falsas, ¿verdad? Eso es modelo válido. Entonces si no es válido, significa que pasamos en caídas, entonces procedamos a agregar manualmente error de estado del modelo. Entonces vamos a, fui a ver nuestros pesos, el controlador. Entonces note que estoy usando un peso. No estábamos usando métodos asíncronos antes de esto. Y eso fue una especie de deliberada otra especie de zócalo alrededor de eso. Pero no, nos deja ver cómo podemos hacer pruebas asíncronas. No hay problema con eso. Tan asíncrona tarea, esa es la firma para el método de prueba. Y entonces aquí estamos esperando nuestro control o llamando a este método llamado sala de libros, obteniendo un objeto de solicitud. Entonces lo que haré aquí es usar punto de control y generar ese método. Salta por ahí y voy a hacer que sea una AsyncTask que devuelva resultados de acción. Muy bien, sólo para asegurarse de que sabe que debe estar devolviendo algo que es de un tipo de mensaje de respuesta HTTP, en términos generales. Está bien, así que con eso hecho, nos deshacemos de ese error. Tenemos esa mini implementación. Entonces podemos afirmar que el resultado debe ser de tipo, tipo de resultado esperado de subasta. De acuerdo, así que sea cual sea el tipo entonces en realidad soy Boston con cualquiera de los dos escenarios. Estamos aseverando que ese debería ser nuestro tipo. También voy a ver que nuestro procesador de reservas de habitaciones. Así que hice un poco de cambio de nombre desde que empezamos esta Lección. Habitación look procesador punto verificar que la sala de libros con la solicitud se llama exactamente ese número de veces, que se está pasando a través de nuestros datos en línea. Nulo. Simplemente puedes hacer una construcción. Y luego una vez que esa compilación tuvo éxito, saltas a Test Explorer. Y luego verás tus pruebas de API. Y yo sólo voy a ejecutar las pruebas de API. Y deberíamos estar viendo o prueba todos son propiedad, o al menos por lo que acabamos de escribir. Bien. Entonces tenemos que leer pruebas porque ambos están viendo sistema no implementado. Muy bien, Así que podemos hacer una pausa aquí. Una vez más, puedes revisar y pausar y replicar si es necesario. Pero cuando regresemos, empezaremos a escribir la implementación. Entonces tenemos algunas cosas que necesitamos cubrir, entre ellas la validación de la OMS se manejará, términos generales, y qué estará haciendo el método del controlador en base a los escenarios. 25. Código de implementación para las pruebas: Muy bien, entonces tenemos nuestras pruebas unitarias escritas. Probablemente aún tenga algo de margen de mejora, pero nos da una idea general de lo que necesitamos implementar para que se haga el requisito básico. Entonces voy a empezar con la validación porque necesito una manera de asegurar que realmente se esté haciendo la validación. El genial de dotnet Core es que solo necesitamos ir a nuestro modelo que sabemos que está entrando y configurar nuestra validación. Por lo que solo para verificar reservar habitación está esperando solicitudes de reserva de habitación. Solicitud de reserva de habitaciones en realidad no tiene campos. Entonces, ¿cómo agrego validadores a los campos? Bueno, recuerda que está heredando de nuestro método base, que podemos sumar las validaciones. Y todo lo que está heredando de esta base, que serían las solicitudes, los resultados, y el objeto de dominio real obtendría esas reglas de validación. Entonces el primero, que es el nombre completo de la persona que voy a agregar requerido. Y que la longitud de la cuerda debería ser más, no debería ser más de 50. Pensable, sé un poco afilado, caen nombres completos. Entonces déjame ponérselo. Por supuesto, en base a su regla de negocio es que agrega sus validaciones en consecuencia. Muy bien, la siguiente, voy a hacer que la longitud de la cuerda sea igual. Por lo que para la dirección de correo electrónico, también voy a hacer que se requiera y luego puedo agregar que quería ser una dirección de correo electrónico. Está bien. El siguiente, voy a añadir que el hecho, el tipo de datos es el IT. Y en este punto podrías incluso pensar otras validaciones que podrías ponerlo en C que deben ser en el futuro o copiar en el pasado, ese tipo de cosas. Ese punto crearías un atributos personalizados o puedes dejarlo heredar del objeto invalidados. Y eso te hará implementar este método aquí con el ojo innumerable resultado de validación llamado validar y darle un contexto de validación. Entonces en este punto probablemente pueda hacer algo como si b es menor que el datetime Node.js. Está bien, Así que esto es lo que estoy viendo. Si los datos que es proporcionado por el usuario resultan ser menores a la fecha de hoy. ¿ Verdad? Entonces voy a dar un nuevo resultado de validación donde les mande señora, Y debe ser en el futuro. Para que puedas tuitear eso. Digo que debe ser una fecha futura, así que puedo decir fácilmente dónde es menor o igual a. Entonces eso significa que no pueden reservar para que sean nuestras hazañas en el pasado. Deben estar en el futuro. Y luego el segundo parlamento, ese tipo de resultados de validación serían el nombre o los nombres de los miembros. Nombres de miembros porque es un área donde se puede aportar un valor, que es lo que estoy haciendo. Por lo que el mensaje de error y luego el aria con miembros que se ven afectados por esta validación. Entonces aquí solo estoy viendo nueva matriz pasando en Name off beat. Entonces para esto, es solo la clave qué campo o el nombre del campo con el error. El problema con hacer esto es que si cambio esto, la fecha de reserva más adelante y olvido actualizar esta cadena, entonces va a haber un desajuste. Por lo que querrás escribir fuertemente viendo el nombre fuera y luego el nombre del campo. Por lo que evalúa esa sería la versión de cadena fuera del nombre del campo. Y entonces los beneficios adicionales a eso serían que si hago un refactor global o aunque refactorice este nombre y me olvido de cambiarlo aquí abajo, solo voy a conseguir errores de compilador y no podré empujar ese código erróneo a producción. Entonces estas son las cosas a medida que avanzamos. Sí, Es desarrollo impulsado por pruebas. Pero al hacer esto, vemos mejores prácticas que reducen la probabilidad de errores a medida que avanzamos en nuestro código. Por lo que acabo de agregar toda esa poca validación a nuestra base. Por lo que eso significa inherentemente cada una de las variaciones de reserva de habitación sabrán tener esa validación básica. Muy bien, entonces lo que vemos aquí para dar como resultado la solicitud y sabemos que el objeto de dominio para reserva de habitaciones también tendrá eso. Ahora en nuestro controlador, necesitamos poner algún código que maneje nuestros escenarios. Entonces lo primero que voy a hacer es comprobar si el estado modelo es válido. Por lo que puedo decir si el estado modelo es válido y esto sería informado por los datos que entran por la solicitud de reserva de habitación. Y mientras estoy aquí, sólo voy a hacerle saber que esta es una publicación de método HTTP, ¿verdad? Entonces este es el método de publicación HTTP. Por lo que tan solo llamando a slash de reserva de habitaciones con una solicitud de post en esa almohada que se parece a nuestras solicitudes de reserva. Sabría que aquí es donde se supone que debe, el gol. Entonces si el estado modelo es válido, entonces quiero proceder a llamar al procesador de reservas de habitaciones. Y voy a llamar al método de la tripulación del libro en los procesos de reserva de habitaciones. Entonces si somos válidos, entonces adelante y llama a ese método. Está bien. Si sin embargo, el suelo inundado resultado, recuerda que en realidad esto está regresando. de búsqueda de habitaciones. Si miramos y vemos qué es ese cuarto matará resultado, ustedes ven aquí que obtenemos pero no nos inundamos y obtenemos esa identificación. Entonces voy a saber que estoy pensando atornillada más invierno. Me di cuenta de que oh, tal vez haya otro escenario por el que podría probar, pero bien. Eso sí consigue los resultados de reserva de habitaciones. Por lo que var resultados es igual a cualquier resultado este término, este devuelve. No, no sería prudente que se lo dijera. Está bien. Bote que estás reservando falló porque recuerda que este resultado tiene ese éxito o fracaso de la inundación. Entonces voy a decir si los resultados puntean inundación, lo siento si hay una inundación es equivalente a, y puedo conseguir las enumeraciones ahí mismo. Y voy a decir, si es equivalente al éxito, entonces quiero devolver todos los fondos de Keras o girar, bien, mantuve la masa con los resultados. Entonces recuerda que ese resultado habría sido compilado por nuestras salas de libros. Por lo que este robot HACEN por la cadena de margarita para ver. Entonces sala BOC está llamando resultado aquí, ¿verdad? Y luego estamos viendo crea eso en base a las solicitudes de sujetalibros. Entonces todos esos campos que han sido transferidos, ¿de acuerdo? Y luego si hay alguna habitación disponible, entonces queremos regresar con la ID y la bandera de éxito. Eso es lo que entra en resultados. De lo contrario, da como resultado siliconas alrededor con todos los valores, justo con la inundación de fallas. ¿ Está bien? Entonces eso es lo que podemos hacer en esa situación. Por lo que acabamos de devolver La respuesta OK con toda la carga útil de resultado con el ID de reserva de habitación, el ID de habitación, todo el shebang, todo lo que se habría compilado a partir de ahí. Entonces si hago todas mis pruebas, Vamos a ver. Ah, lo siento, estoy recibiendo un error de compilación porque no todas las rutas de código regresan. Entonces voy a devolver mala petición aquí, ¿verdad? Hace, si no nos llega hasta el viejo K, entonces sólo voy a ver un retorno malas peticiones. Entonces déjame simplemente arrojar en mis pruebas otra vez. Y luego verás que tengo una prueba verde y otra roja. Por lo que la prueba está viendo que debería ser de resultados de objeto de mala solicitud, y solo fue un mal resultado de solicitud. Está bien, Así que eso trae una pregunta interesante. ¿ Cuál es la diferencia entre los resultados de objeto de solicitud mala y los resultados de una solicitud mala? Bueno, lo justo lo mismo con el viejo caso. Entonces los resultados del objeto OLC son diferentes a, ¿de acuerdo? Por lo que ves viejo resultado clave está ahí porque no hay parámetros. Entonces bien, por sí mismo significa no hay parámetros. No obstante, una vez que pones parámetros ahí, una vez que estás pasando un objeto con la respuesta, entonces se convierte en los viejos resultados del objeto clave. Tan mala solicitud por sí misma es el resultado de la batería por solicitudes resultados. Pero podríamos poner datos ahí dentro. Por lo que en términos generales, cuando devuelves una mala solicitud, porque fuera de una validación de campo, puedes simplemente poner el estado modelo ahí dentro. Y todo el JSON sabrá desserializarlo y presentó al usuario que estos son los puntos de validación basados en el fallo, ¿no? De igual manera, cuando la bandera no tiene éxito, probablemente no quiero darle el estado modelo porque la ley del estado modelo es válida. No obstante, la reserva falló, tal vez no había habitaciones disponibles o algo así. No fue realmente una validación de campo para los resultados de la batería o mala solicitud. Y aquí es donde probablemente empieces a ponerte peaky en función de cómo quieres que funcione tu diseño de API. Bueno, lo que voy a hacer, ya ha pasado la validación aquí. Y digamos que no había habitaciones disponibles. Por lo que esto no nos dio la inundación del éxito. Entonces aquí abajo, claramente si no conseguimos la bandera de éxito que necesitaban o la llave eterna, una vez que fui a hacer es decir modelos, el error del modelo, ¿verdad? Y esto soy yo sólo asumiendo que sólo ha llegado tan lejos porque no consiguió el subsista Flau'jae era válido pero no consiguió la inundación del éxito, Alguien tiene un error de modelo yo mismo. Y lo voy a agregar al nombre apagado. Y el campo estará viniendo de la habitación, se cuidará solicitar punto campo fecha. Ya que sólo quería apuntar, dirán importante usando este nombre de parámetro es. Porque una vez más, si refactorizamos, esto definitivamente sería considerado en la cualquiera de las dos listas de errores son una lista de factores de riesgo no lo hacen. Por lo que es menos seguimiento a granel y tratar afinar las cuerdas mágicas óseas que están lanzando fuera de la aplicación. Por lo que voy a agregar un estado modelo se acaba de hacer un D8. Y voy a ver que no hay habitaciones disponibles para una fecha determinada. Está bien. Esa será la única razón por la que se sienta bien. Este pensamiento basado en las reglas de negocio que tenemos hasta ahora. Y entonces eso se les sumaría, todos esos datos, seguimos regresando la mala solicitud con dicho estado modelo. De acuerdo, así que ahí mismo todo en un solo swoop donde ya sea regresando viejo QA o devolviendo la solicitud de mantequilla con los errores de validación. Y éste es una especie de ad hoc basado en el proceso, ¿no? Entonces volvamos a hacer todas las pruebas. Y ahora verás que tengo esa garrapata verde, dos de dos pasando y eso es excelente. Entonces ya ves que acabamos de hacer una rápida implementación para cumplir con nuestra lógica de prueba más en nuestro pozo, para conocer a los artistas lógica, correcta, hicimos la implementación, pero implementamos algo que no necesariamente estamos probando para nuestra contabilidad con artistas, que es esa bandera de resultado. Entonces voy a saltar de nuevo a la prueba y voy a agregar eso a la sección impulsada por pruebas. Entonces voy a añadir la enum aquí. Si puedo recordar, it, va a reservar bandera de resultado o agregar a alguien para agregar que como parámetro o prueba basada en datos, es nullable. Y voy a decir bandera de resultado de la teneduría. Entonces voy a tener que añadir que los datos del interior deberían, cuando todo sea válido, tener esa bandera para el éxito. Y cuando las cosas no son válidas , también debe tener esa maceta para el fracaso. Entonces en mi rango, voy a agregar esta declaración if para ver si la bandera de resultado del libro King tiene un valor, es decir, se proporcionó uno, sí, se proporcionó uno. Y francamente, ni siquiera necesito hacerlo más liberal, Ven a pensarlo. Solo estoy pensando en introducirlo después del hecho. Pero quiero decir, yo soy el que controla los datos, así que lo voy a presentar y dejarlo en paz. Entonces no tengo ningún escenario donde alguna vez sería no, todos modos, no en esta prueba. Entonces déjame retroceder. No es un parámetro anulable. Y estamos pasando en uno por el éxito, uno por el fracaso. Y luego recuerda que teníamos nuestro campo de resultados siendo inicializado aquí arriba. Y el liquidar ver es que el método de sala de libros cuando se le da una solicitud debe devolver un resultado. Entonces lo haré, estoy viendo aquí es que cualquier valor que esté en este escenario o en los datos que se pasan para ese escenario, establezca que sea la bandera para el objeto resultado, que se va a devolver una vez que se llame a ese método de todos modos. Entonces solo voy a seguir adelante y hacer estas pruebas una vez más solo para asegurarme de que todavía voy a estar recibiendo una nota que pase, cierto. Está solo. Y ahí vamos. Entonces sigo recibiendo pases. Y esas son todas las pruebas. Entonces solo voy a ejecutar todas las pruebas a la vista y todo está pasando. Entonces esa es una forma muy básica de probar tu API y por extensión tu aplicación web. Porque la única diferencia real una vez más, entre yo probando una API versus tú probando páginas Razor arriba o un MVC arriba serían los tipos de retorno para los que estás probando en función de los tuyos. Ahora en términos generales, cuando ingresa el MVC, bien vas a estar devolviendo una vista o redirigiéndote a otra. Redirigir a otra vista, nuestro radar a subasta más bien. Cuando se trata de nuestras páginas Razor arriba, o estás regresando página o estás redirigiendo a página y usas otro pj de retorno, que se ve como resultados de página. Si no me equivoco. Por lo que puedes tener redireccionamiento a los resultados de la página. Por lo general, hacer eso cuando fue una operación exitosa. Pero cuando no es una operación exitosa, normalmente solo devuelves el pH. Ahí vamos. Entonces solo necesito que esa biblioteca haga volver a probar si solo estás enviando resultados de copia de seguridad comer. Está bien, así que de la misma manera que si es válido, quiere redirigir a pitch. Y si no es válido, te devolverían a resultados pagados en IUIE, estarías mostrando al usuario la página junto a los errores del estado del modelo, ¿verdad? Si fuera un MVC arriba, sería, solo escribiré resultados de subasta. ¿ Verdad? Di Qué haces habrá resultados de un axón o sería un redireccionamiento a los resultados de la acción. Pero es más o menos lo mismo. Los escenarios para los que estás probando probablemente difieren en función de la aplicación que estás probando. Pero en última instancia los principios son los mismos. Entonces eso realmente va a detener a este menor. Sé que no nos complicamos demasiado, pero hicimos lo suficiente. Por lo que puedes apreciar flujos enteros de bajo código y prueba de unidad santa a nivel de aplicación, probando qué está haciendo el controlador y cómo podrían quedar nuestras aseveraciones. Entonces te animo a crear los endpoints, adelante y hacer algunas pruebas más y ver si puedes pensar en otros escenarios que probablemente quieras probar. Estaré feliz de escuchar. Y en todo caso, me disparen algunos comentarios y podemos trabajar en ello en consecuencia. 26. Ejecutar y probar la aplicación básico de ASP.NET: Muy bien chicos a todo esto, sentados y probando. Es hora de entregarlo a los usuarios de la aplicación para probarlo realmente para alterarlo. Por lo tanto, para poner en marcha la API, necesitamos unas cuantas configuraciones más. Una es la adición al servicio, el contenedor del COI, la fuente que necesitamos, el servicio de reserva de habitación ojo, que en realidad está hablando con la base de datos. Entonces sí, tenemos el procesador. El procesador se basa en el servicio y nuestra aplicación necesita saber que necesitamos contar con nuestra representación del servicio para que podamos tener representación del procesador. Entonces de nuevo, sigamos adelante y agreguemos que los servicios punto i servicio de reserva de habitaciones, servicio de reserva de habitaciones. Y por supuesto usa tu punto de control para incluir cualquier cosa que falte. Ahora podemos saltar a nuestra consola Package Manager. Y si no es donde lo ves en mi pantalla por ti mismo, puedes seguir adelante y golpear herramientas NuGet, gestor de paquetes, y para conseguir la consola. En lo que va de esta consola, queremos cambiar nuestro proyecto objetivo por el proyecto de persistencia. ¿ Por qué? Porque ahí es donde vive nuestro contexto DB. Por lo que todas las bibliotecas y demás para los comandos están a punto de correr en vivo en ese proyecto, sólo necesitábamos apuntar ahí. Entonces voy a decir add dash migration, y voy a decir migración inicial. Tan rápido remedio a ese error es obtener el paquete de diseño en el proyecto API, ¿verdad? Entonces si golpeo la persistencia, notarás que tiene todo este bloque XML dedicado al paquete de diseño. Entonces en realidad sólo voy a copiar esto. Y creo que otra modificación que necesitamos hacer es estas dos diferentes somos biblioteca central. Creo que cuando creamos esa persistencia, usamos SQL Server. Entonces, y luego cuando llegamos a la API, decidimos, Vale, vamos a usar la luz SQL. Entonces si quieres seguir usando SQL Server, estás cómodo con eso asentado entonces bien. No hay problema sí se asegura de que cambies la nuestra, la cadena de conexión y todo para la API. De lo contrario, si solo quieres seguirme y asegurarte de que no tengas problemas, puedes seguir adelante y cambiar esto. Simplemente puedes cambiar la verbiage de SQL Server a TI SQL. De acuerdo, así que yo y ese cambio pero aún copio todo este bloque para el diseño. Y vamos a saltar hasta la API, asegurarnos de que esto también diga SQL ITE y luego escribir un muro de eso. Yo sólo voy a pegar ese bloque de diseño, alguien que haga una compilación. Y en ese punto el proyecto API sin pick up que tiene ese paquete de diseño. Y luego puedo volver a mi PCM y volver a intentar esta migración. Y después de una compilación exitosa, verás que sabemos con éxito tener nuestra primera migración. Entonces después de que tengamos la migración, solo necesitamos decirlo base de datos. Y eso se hace. Entonces echemos un vistazo a todo lo que tenemos. Contamos con habitaciones de reservas de habitaciones. Estas son todas las tablas que creamos y algunos datos en los que lo hubiéramos visto. Entonces ya ves que tenemos habitaciones. Ver eso en. Si lo desea, puede crear un endpoint donde el usuario pueda obtener la lista de habitaciones. Puede crear otro endpoint para obtener la lista de habitaciones disponibles. Pero el punto de TDD es que vas a tener que escribir esa prueba primero y luego implementar. Está bien, entonces creo que ya te he dado suficiente munición para que puedas ir y hacer esas por tu cuenta. Por ahora, probemos la API solo para asegurarnos de que nuestro código para el que tenemos una excelente cobertura realmente funcione. Entonces porque durante la creación de API habíamos ticulcado, incluir el soporte de API abierta, obtenemos este Swagger, ¿verdad? Entonces si no estás familiarizado con el fútbol, es una poderosa herramienta útil tanto en pruebas como en documentación de API. Si lo estás familiarizado, entonces esto debería ser un no-cerebro tiene que aguantar para usarlo. Entonces aquí ves que nos dan un ejemplo de lo que se espera cuando estamos a punto de hacer una solicitud de post para una reserva de habitación. Si hago clic Pruébalo, y no voy a cambiar los nuestros propios los valores. Simplemente voy a dar clic en Ejecutar, luego me sale este desagradable error de aspecto. Entonces solo voy a leer a través de él y está viendo SQLite excepto Norte. Tan dividida, Hay algo que me perdí con las configuraciones. Simplemente voy a saltar de nuevo al bloque de código en el archivo de inicio, tenemos nuestra conexión, tenemos o contexto AV. Y creo que necesito algunas líneas más para asegurarme de que se cree la base de datos. Entonces me encanta este método, aseguro que la base de datos creada y le estoy dando el, el parámetro para la conexión SQLite. Por lo que hay controller.js y generar este método el cual puede ser privado y estático. Ahora mismo por esto, lo que voy a hacer es. Objeto Builder. Entonces en todo el objeto constructor ya. Por lo que esto ha sido para ser un nuevo constructor de opciones de contexto DB de tipo los contextos DVI que estamos usando. Y luego sepan que tenemos que voy a decir constructor, se supone que usan SQL lite, ¿verdad? Entonces sólo voy a copiar esto. Después de todo eso, voy a decir que usar var o contextos es igual a una nueva instancia de contextos RDB. Entonces lo siento, me perdí estas líneas antes. Entonces solo vamos a pasar en las opciones de punto constructor porque necesito darle las opciones en cualquier momento que instanciemos eso. Y luego diremos contextos, base de datos de puntos, punto asegurar creado. Está bien. Simplemente lo estamos agregando se asegura de que se cree la base de datos. Sí, nos estropeamos en todo eso, pero luego debido a la naturaleza de la base de datos, necesitamos asegurarnos de que realmente se cree en tiempo de ejecución. Está bien, así que intentemos eso otra vez. Entonces saltando de nuevo a jadeo y haciendo el tote y el ejecutar y saber a quién ves que algo se ve un poco mejor. Entonces lo que estamos viendo aquí es la respuesta. Entonces quiero decir, hay oportunidades, por supuesto, el limpiarlo. Entonces porque se ve aquí la inundación es de 000 porque la bandera de éxito fue 0 y la inundación de fallas fue una. Podríamos ir y por supuesto luego cambiar los valores enum. O podríamos cambiar el campo de resultados para que la inundación sea una cadena y en realidad imprimir las palabras, el éxito o fracaso en consecuencia. Eso depende de ti. Si pongo algo que es inválido, como pongo en una escrituras que fue el mes pasado y trato de ejecutar eso. Entonces ven aquí estoy sacando ese estado modelo 400 o donde deben estar las escrituras en el futuro. Muy bien, entonces esos son el tipo de cosas que hemos implementado y hemos probado para que conozcamos el comportamiento una vez que probamos el escenario en practicidad. Entonces esos son los diferentes niveles de pruebas que pasamos por nuestro ciclo rojo-verde, pueden asegurar que ese es nuestro código era a prueba de balas en cualquier medida que lo hiciéramos. Y luego saber cuando el cliente está probando, habrían conseguido su documento de prueba para ver. Aquí te presentamos tus escenarios de prueba y asegúrate de que estos son los resultados. Cualquier variación de eso resultaría en que quisieran decirte que refactorices. Entonces si pongo algunos invalidados, esto es ver el 18 mes del año y hago clic en Ejecutar, eso va a llevar a un choque. Entonces sí, sigue siendo una mala petición y sí, estoy tratando de conseguir algunos objetos aquí. Estás viendo que el valor JSON no se pudo convertir, pero entonces probablemente esto no sea lo que un usuario necesita ver o alguien consumiendo la API. Entonces en este punto y todo tu departamento de control de calidad volvería a ti y te diría, oye, ya sabes, bajo esta circunstancia esto sucede, por favor llámalos, no lo vi por ello. Entonces regresas, escribes una prueba para asegurarte de que un escenario como ese no exista o se comporte de esta manera. O escribes la prueba de acuerdo a cómo quieres que se comporte. Y luego escribes el código para asegurarte de que lo haga. Entonces en pocas palabras, eso es el desarrollo impulsado por pruebas con C-Sharp. Cuando volvamos, podemos hacer un resumen rápido de todo lo que hemos pasado y luego concluir. 27. Revisión de cursos: Muy bien chicos, así que han llegado a la conferencia final en este curso. Confío en que hayas desarrollado tus conocimientos de desarrollo impulsado por pruebas con botnet core. Y a pesar de que aquí aprendimos dotnet core, los fundamentos del mismo se pueden aplicar a cualquier otro framework o a cualquier otro lenguaje que pudieras terminar usando. Tienes unidad PHP para el desarrollo de PHP, tienes JUnit para el desarrollo de Java, incluso Angelo y reacciona. Todos esos tienen sus propios marcos de pruebas unitarias y los principios son los mismos. desarrollo impulsado por pruebas significa que vas a escribir la prueba unitaria va a fallar. Escribes el código y luego consigues que pase. Al hacer ese ciclo, se ve cómo se necesita torneado, querido frío tipo de separado. Entonces, ¿cuáles son las cosas que quería señalar es que empleamos la separación de preocupaciones en todos los niveles. Trató de romper todas las diferentes partes de nuestra aplicación en sus propios proyectos. Por lo que la API era por sí misma. El núcleo, la lógica empresarial era por sí mismo. Y luego tuvimos las operaciones relacionadas con los datos por sí mismos. En términos generales, esto es sólo una plantilla basada en su contexto. Es posible que termines con más o incluso menos proyectos. Pero el punto es que cuando los tienes divididos en esas cuentas los tamaños son unidades, te hace mucho más fácil probar las diferentes capas de tu aplicación para asegurarte de que cada capa esté actuando como debería. Y entonces la propia prueba unitaria se asegura de que ese componente o esa funcionalidad de función en ese componente o en esa capa esté actuando como debería. Entonces tenemos la persistencia con todas las operaciones de datos, con el núcleo, con la lógica empresarial, todas las declaraciones if y tomando las decisiones. Admitimos esta fecha o no, ese tipo de cosas. Y luego agregamos la API, que básicamente representa la aplicación. Podría haber sido una UI. El API debido a la menor sobrecarga necesaria con la interfaz de usuario y así sucesivamente. Pero los principios de prueba y desarrollo para seguir siendo bastante los mismos. A lo largo de este viaje también aprendió que en pruebas unitarias tienes diferentes tipos de pruebas unitarias, proyectos, al menos con dotnet core, tienes MSTest, que es vainilla, eso es directamente de Microsoft. ¿ Tienes x unidades y tienes n unidades? Cada uno tiene sus propios pros y contras. En este discurso, utilizamos x unidades. Y vimos que podíamos escribir pruebas impulsadas por pruebas, lo siento, basadas en datos donde creamos una teoría y luego pudimos simplemente pasar en valores que representan los diferentes escenarios. En tanto que en otros marcos podría no ser tan fácil con mi duro escribir una prueba unitaria para el rodaje y una R1 para cuando es válida y aunque 14 y es inválida. Y así para tal vez 23 pruebas que habrías escrito en los otros frameworks, habrías escrito solo una prueba pero con datos diferentes siendo pasados para los escenarios. Y para mí eso también ayuda a arreglar el código porque entonces tengo que estar atenta y saber que este método o representa lo que debería hacer el método que estoy probando. Entonces bajo diferentes circunstancias, ¿cuál sería la vieja columna? Entonces en mi mente, me ayudó a asegurarme de que estoy escribiendo código que es inclusivo de los diferentes escenarios. Y escribir el menor código posible, pero justo lo suficiente para asegurarme de que mis campos de prueba unitarios sean mi escenario realmente llega a buen término. Entonces hicimos pruebas de nivel de aplicación, hicimos persistencia de las pruebas, e hicimos pruebas de lógica empresarial, y todas ellas hasta ahora son verdes cuando todo eso, cuando hacemos nuestro carajo no introduzcamos algo a nuestro código. Siempre queremos asegurarnos de que las pruebas estén pasando y luego podamos seguir adelante. Entonces con todo eso dicho y hecho, solo voy a revisar los cambios. Y ese es mi mensaje. Entonces voy a seguir adelante y comprometerme todo y hundirme. Y se puede ver el último código fuente. caso de que lo necesites en los recursos. Entonces gracias por quedarte conmigo y te veré pronto.