Hemos llegado al punto en nuestra serie de tutoriales donde agregaremos algo de validación para enviar nuevos hilos y respuestas. En este tutorial, investigaremos cómo podemos crear pruebas para respaldar nuestras llamadas de validación en los controladores. Necesitaremos configurar algunas pruebas para admitir la creación de nuevos hilos. También configuraremos una prueba para crear nuevas respuestas. Nos encontraremos con algunas oportunidades para refactorizar a lo largo del camino, así que lo abordaremos tan bien como avancemos.


Un refactor rápido

Vamos a tratar con las pruebas dentro de la clase CreateThreadsTest. Antes de comenzar a agregar validación a las pruebas, refactoricemos un poco. Primero veremos la prueba test_a_logged_in_user_can_create_new_threads. Parece que ahora que tenemos la prueba, estamos creando un hilo y almacenándolo en la base de datos incluso antes de hacer una solicitud de publicación. De hecho, queremos probar si la solicitud de publicación fue exitosa. Así que se necesitan algunos cambios. Capturaremos la respuesta de la solicitud de publicación e inspeccionaremos el encabezado para ver dónde se redirigió. Aquí es cómo:

Ahora ejecuta esa prueba específica para ver qué obtenemos.

vagrant @ homestead: ~ / Code / forumio $ phpunit --filter test_a_logged_in_user_can_create_new_threads
PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores.

"http: // localhost / threads / aut / 1"

Dimos este paso para que pudiéramos ver cuál es la identificación del hilo que se genera. En la salida, 'aut' es el canal y 1 es la identificación.

Bien, dado que ahora conocemos la ruta de redireccionamiento, podemos hacer una solicitud a esa ruta y luego hacer nuestras afirmaciones para ver si el cuerpo y el título están presentes. ¿Tener sentido? Veamos cómo hacer eso.

Ejecute la prueba test_a_logged_in_user_can_create_new_threads una vez más, y todos estamos bien en el capó.

vagrant @ homestead: ~ / Code / forumio $ phpunit --filter test_a_logged_in_user_can_create_new_threads
PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores.

. 1/1 (100%)

Tiempo: 815 ms, memoria: 10,00 MB

OK (1 prueba, 2 afirmaciones)

Crear una prueba de validación

Con ese pequeño refactor fuera del camino, configuremos nuestra primera prueba de validación. Al crear un hilo, sabemos que, como mínimo, necesitará un título. Bien, podemos crear una prueba para reflejar eso.

Pensemos primero en un pseudocódigo.

  • Dado que un usuario ha iniciado sesión
  • Ese usuario crea un hilo defectuoso
  • Y ese usuario realiza una solicitud de publicación a / threads
  • La sesión debería tener un error

En Laravel, si hay un error de validación, se colocará una variable $ errors en la sesión, así que eso es lo que queremos probar aquí. Suena bien, aquí está el código que representa este caso de prueba.

Entonces, ¿qué pasa aquí? Bueno, la primera parte de $ this-> signIn (); simplemente inicia sesión en el usuario. Luego con el código de $ thread = make ('AppThread', ['title' => null]); - estamos creando un hilo defectuoso. ¿Por qué? Porque como segundo argumento de la función make () anulamos el título para que tenga un valor nulo. Por supuesto, queremos que los hilos tengan un título válido, no un valor nulo, por lo que esto es bueno para nuestro caso de prueba. Por último, hacemos la solicitud de publicación con los datos defectuosos que tenemos y debemos afirmar que la sesión tiene errores. Si la sesión tiene el error, la prueba pasa. Hagamos esa prueba ahora y veamos qué obtenemos.

vagabundo @ homestead: ~ / Code / forumio $ phpunit --filter test_a_thread_requires_a_title
PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores.

F 1/1 (100%)

Tiempo: 964 ms, memoria: 12,00 MB

Hubo 1 falla:

1) TestsFeatureCreateThreadsTest :: test_a_thread_requires_a_title
A la sesión le falta la clave esperada [errores].
No se pudo afirmar que lo falso es verdadero.

/home/vagrant/Code/forumio/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestResponse.php:635
/home/vagrant/Code/forumio/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestResponse.php:673
/home/vagrant/Code/forumio/tests/Feature/CreateThreadsTest.php:41

¡FALLOS!
Pruebas: 1, afirmaciones: 1, fallos: 1.

De hecho, esta prueba está fallando. Vemos que el error de Sesión falta la clave esperada [errores]. Lo que eso nos dice es que la validación no funcionó, ya que no se completó ningún error en la sesión. Bueno, esto tiene mucho sentido, ¿verdad? No hemos agregado ninguna validación al método store () en ThreadsController. Apuesto a que si ahora agregamos la validación en el método store () del ThreadsController, lograremos que nuestra prueba pase. Podemos actualizar ese método así:

¡Si! Estamos pasando ahora.

vagabundo @ homestead: ~ / Code / forumio $ phpunit --filter test_a_thread_requires_a_title
PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores.

. 1/1 (100%)

Tiempo: 981 ms, memoria: 10,00 MB

OK (1 prueba, 2 afirmaciones)

Esto significa que el método de validación está funcionando correctamente en nuestro controlador, y nuestra prueba también está probando como debería.


Pruebas de validación para cada campo

Lo que nos gustaría hacer es crear una prueba separada para cada campo que validamos en una solicitud realizada al servidor. Podemos extraer un método de parte del código de prueba para ayudar con esto. Aquí continuaremos usando la prueba de test_a_thread_requires_a_title, pero extraeremos parte de su código a una función llamada publishThread. Aquí está ese código.

Ejecutar la prueba ahora con nuestro nuevo refactor muestra que funciona bastante bien.

vagabundo @ homestead: ~ / Code / forumio $ phpunit --filter test_a_thread_requires_a_title
PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores.

. 1/1 (100%)

Tiempo: 955 ms, memoria: 10,00 MB

OK (1 prueba, 2 afirmaciones)

Dado que ahora hemos extraído ese nuevo método, lo usamos fácilmente para realizar pruebas adicionales. Ahora podemos hacer una prueba para el cuerpo de un hilo. Vamos a agregarlo así:

Ejecutemos la prueba en la clase completa ahora.

vagabundo @ homestead: ~ / Code / forumio $ phpunit --filter CreateThreadsTest
PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores.

... F 4/4 (100%)

Tiempo: 1,58 segundos, memoria: 14,00 MB

Hubo 1 falla:

1) TestsFeatureCreateThreadsTest :: test_a_thread_requires_a_body
A la sesión le falta la clave esperada [errores].
No se pudo afirmar que lo falso es verdadero.

/home/vagrant/Code/forumio/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestResponse.php:635
/home/vagrant/Code/forumio/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestResponse.php:673
/home/vagrant/Code/forumio/tests/Feature/CreateThreadsTest.php:41

¡FALLOS!
Pruebas: 4, afirmaciones: 9, fallas: 1.

Ok, podemos ver que nuestra nueva prueba test_a_thread_requires_a_body está fallando. ¿Y por qué está fallando? Oh, sí, es cierto, no hemos incluido el 'cuerpo' como un atributo obligatorio de las reglas de validación en el método store () de ThreadsController. Por lo tanto, en nuestra prueba, cuando hacemos una solicitud de publicación, simplemente pasa volando y la sesión no obtiene el error esperado. ¿Cómo lo arreglamos? Nuevamente actualizamos nuestras reglas en el método de validación como tal.

Ahora, cuando hacemos una solicitud de publicación en nuestra prueba con el valor nulo para el cuerpo, la función de validación debería detectarlo y completar la sesión con un error. Esto significa que la prueba debe pasar. ¿Lo hace?

vagabundo @ homestead: ~ / Code / forumio $ phpunit --filter CreateThreadsTest
PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores.

.... 4/4 (100%)

Tiempo: 1,26 segundos, memoria: 10,00 MB

OK (4 pruebas, 10 afirmaciones)

Sí: todas las pruebas están pasando de nuevo.


Validación de una ID de canal

Lo último que agregaremos con respecto a los casos de prueba para la validación es validar que se envíe el ID de canal correcto en una solicitud de creación de hilo. Este es un poco diferente a los dos primeros. Veamos cómo podríamos hacer esto.

En esta prueba, primero creamos dos canales en la base de datos. Estos canales van a tener id 1 y 2. Luego, publicamos un hilo y afirmamos que el channel_id no puede ser nulo. También hacemos una segunda ejecución para afirmar que el channel_id no es igual a algún valor que sabemos que no existe en la tabla de la base de datos. Por supuesto, actualice el método de validación en nuestro controlador y ejecutemos la prueba.

vagabundo @ homestead: ~ / Code / forumio $ phpunit --filter CreateThreadsTest
PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores.

.... F 5/5 (100%)

Tiempo: 1,69 segundos, memoria: 14,00 MB

Hubo 1 falla:

1) TestsFeatureCreateThreadsTest :: test_a_thread_requires_a_valid_channel
A la sesión le falta la clave esperada [errores].
No se pudo afirmar que lo falso es verdadero.

/home/vagrant/Code/forumio/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestResponse.php:635
/home/vagrant/Code/forumio/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestResponse.php:673
/home/vagrant/Code/forumio/tests/Feature/CreateThreadsTest.php:52

¡FALLOS!
Pruebas: 5, Afirmaciones: 13, Fallos: 1.

Hmm. La prueba está fallando, a pesar de que colocamos un indicador obligatorio en el modelo de validación. Que esta pasando. Bueno, el hecho de que sea obligatorio no impide que el usuario envíe a través de un channel_id que es un valor loco que no existe en la tabla de la base de datos. Parece que la validación debe ser más específica. Necesitamos usar este formato aquí:

required|exists:channels,id

¿Qué dice esta regla? Dice que el channel_id es obligatorio, pero que el valor proporcionado ya debe existir en la tabla de canales en la columna id. ¿Tener sentido? Podemos actualizar el método de validación una vez más y ejecutar la prueba. Debería pasar en este punto.

vagabundo @ homestead: ~ / Code / forumio $ phpunit --filter CreateThreadsTest
PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores.

..... 5/5 (100%)

Tiempo: 1,34 segundos, memoria: 10,00 MB

OK (5 pruebas, 14 afirmaciones)

Todas las pruebas pasan de nuevo en la clase CreateThreadsTest.


Agregar validación a una respuesta de hilo

Hemos hecho un gran trabajo al configurar la validación y las pruebas asociadas para crear nuevos hilos. Abordemos ahora la creación de nuevas respuestas. Debería ser más fácil esta vez ya que conocemos la idea básica de cómo resolver esto ahora. Primero desarrollemos el pseudocódigo para la prueba como lo hacemos habitualmente.

  • Dado que hay un usuario registrado
  • Dado que tenemos un hilo
  • Dado que tenemos una respuesta con un cuerpo nulo
  • Cuando se publica esta respuesta defectuosa
  • Deberíamos ver un error

¡Excelente! Creemos el código para reflejar esto:

Ahora podemos ejecutar la prueba para esta nueva función de prueba.

vagrant @ homestead: ~ / Code / forumio $ phpunit --filter test_a_reply_requires_a_body
PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores.

F 1/1 (100%)

Tiempo: 992 ms, memoria: 8,00 MB

Hubo 1 falla:

1) TestsFeatureParticipateInForumTest :: test_a_reply_requires_a_body
A la sesión le falta la clave esperada [errores].
No se pudo afirmar que lo falso es verdadero.

/home/vagrant/Code/forumio/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestResponse.php:635
/home/vagrant/Code/forumio/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestResponse.php:673
/home/vagrant/Code/forumio/tests/Feature/ParticipateInForumTest.php:42

¡FALLOS!
Pruebas: 1, afirmaciones: 1, fallos: 1.

Falla porque la sesión no contiene la clave esperada. ¡Por supuesto! Necesitamos agregar la regla de validación real al método store () del RepliesController. Hagámoslo ahora.

Esta prueba debería pasar ahora y, de hecho, todas las pruebas deberían pasar. Ejecutemos todo el conjunto de pruebas que hemos creado hasta ahora.

vagabundo @ homestead: ~ / Código / forumio $ phpunit
PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores.

.................. 18/18 (100%)

Tiempo: 2,39 segundos, memoria: 12,00 MB

OK (18 pruebas, 32 afirmaciones)

¡Bien! ¡Esto es fannnnnnnnnnntastic! Se ejecutaron 18 pruebas con 32 afirmaciones y todo está pasando.


Cómo escribir un resumen de casos de prueba de validación

Este fue un tutorial divertido que nos hizo aprender a crear pruebas para verificar que nuestras reglas de validación son correctas y funcionan correctamente en nuestros controladores. Este es uno en el que estaba un poco confundido, pero después de este tutorial, ¡las cosas están bien y claras!