En este tutorial, continuaremos desarrollando nuestra aplicación y las pruebas asociadas. En primer lugar, secaremos nuestro archivo de rutas haciendo uso de un recurso de ruta en lugar de crear manualmente cada ruta para cada verbo http. Luego pasaremos a agregar un formulario para que los usuarios autenticados envíen un nuevo hilo. También actualizaremos algunos middleware y actualizaremos nuestras pruebas para admitir estas nuevas funciones. Finalmente, nos centraremos en la nueva función de Laravel que le permite alternar el manejo de excepciones en sus pruebas, lo que a veces es necesario.


Limpiar archivo de rutas con Route :: resource

Podemos comenzar con la idea de usar Route :: resource en nuestro archivo de rutas. Hasta ahora, nos hemos centrado en usar solo los verbos tranquilos en nuestro archivo de controladores y rutas. Estamos empezando a ver un poco de duplicación en nuestro archivo de rutas. Podemos reducir esto simplemente usando Route :: resource. En el siguiente fragmento, observe que podemos deshacernos de 4 líneas de código con 1. Las dejaremos comentadas aquí para mostrar que tener 1 Ruta :: recurso es el equivalente a tener las 4 rutas configuradas manualmente.

Incluso podemos ejecutar todas nuestras pruebas, y aún así pasan, lo cual es fantástico.

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

............ 12/12 (100%)

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

OK (12 pruebas, 15 afirmaciones)

Actualizar ThreadsController @ create para mostrar un formulario

Para que un usuario que haya iniciado sesión envíe un hilo, debemos mostrarle un formulario. Podemos actualizar nuestro método de creación en ThreadsController para admitir esto aquí.

Por supuesto, también necesitamos crear el archivo de vista real en resources / views / threads / create.blade.php. Podemos agregar el siguiente marcado para que funcione.

Cuando visitamos http://forum.io/threads/create, ahora vemos un formulario bastante atractivo.
formulario para enviar un nuevo hilo

No sea tímido, siga adelante y complete el título y el cuerpo del formulario, luego haga clic en Publicar.
publicando un nuevo hilo

¡Dulce! Al publicar el hilo, nos redirigen directamente a esa página del hilo y podemos verlo. También podríamos publicar una respuesta si lo deseamos.
la publicación de hilos funcionó muy bien

La respuesta del hilo ahora también está en su lugar.
una nueva respuesta está en su lugar


Actualice el middleware para proteger esta ruta

Si un invitado examina el punto final / threads / create, todavía se muestra un formulario. Ni siquiera queremos mostrar un formulario para enviar un nuevo hilo para los usuarios que no han iniciado sesión. Corregiremos eso actualizando el middleware que configuramos anteriormente.


Crear nueva redirección de invitados de prueba de hilos / crear

Si intenta cargar hilos / crear como invitado, de hecho será redirigido a la página de inicio de sesión gracias a nuestro nuevo middleware anterior. Sin embargo, todavía no tenemos una prueba real para esto. Podemos agregar uno en la clase CreateThreadsTest ahora.

Si ejecutamos la prueba, tenemos un pequeño problema.

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

E 1/1 (100%)

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

Hubo 1 error:

1) TestsFeatureCreateThreadsTest :: test_guest_can_not_see_thread_create_form
IlluminateAuthAuthenticationException: no autenticado.

Esto resalta algo con lo que a veces se puede encontrar durante las pruebas. Hay momentos en los que desea que la prueba arroje una excepción y otros en los que no. Sin embargo, resulta que esto ahora está integrado en la versión 5.5 a través del método $ this-> withoutExceptionHandling (). Así que tendremos que volver a nuestro archivo Handler.php y eliminar la línea que tiene if (app () -> environment () === 'testing') throw $ exception;

Entonces, si actualizamos nuestra prueba como la siguiente, debería pasar.

Me pregunto qué pasará si ejecutamos todas las pruebas. Recuerde, previamente habíamos configurado nuestro Handler para que siempre lanzara la excepción en las pruebas. Ya no tenemos eso, por lo que podríamos ver algunos fracasos.

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

F..F ......... 13/13 (100%)

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

Hubo 2 fallas:

1) TestsFeatureCreateThreadsTest :: test_guest_can_not_create_threads
Error al afirmar que se lanza una excepción de tipo "IlluminateAuthAuthenticationException".

2) TestsFeatureParticipateInForumTest :: test_unauthenticated_users_can_not_add_replies
Error al afirmar que se lanza una excepción de tipo "IlluminateAuthAuthenticationException".

¡FALLOS!
Pruebas: 13, Afirmaciones: 17, Fallos: 2.

Ah, ja, vemos algunos fracasos. Parece que tendremos que actualizar las pruebas test_guest_can_not_create_threads () y test_unauthenticated_users_can_not_add_replies () para incluir una llamada a $ this-> withoutExceptionHandling () y deberíamos volver a pasar. Probémoslo.


Corrección para test_guest_can_not_create_threads ()


Corrección para test_unauthenticated_users_can_not_add_replies ()

Ahora podemos ver que todo vuelve a pasar.

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

............. 13/13 (100%)

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

OK (13 pruebas, 17 afirmaciones)

Cómo alternar el resumen de manejo de excepciones

A veces, cuando está escribiendo pruebas, se lanza una excepción durante la prueba que inadvertidamente hace que la prueba falle cuando debería haber pasado. En PHP simple, puede usar el control de flujo try catch para detectar errores. Una nueva característica en la última versión de Laravel ahora le permite deshabilitar selectivamente el manejo de excepciones para casos especiales. Antes de esto, Jeffrey Way y Adam Wathan nos dieron una solución alternativa con un código personalizado con el que podríamos completar nuestro TestCase.php. Desde entonces, Taylor ha movido este código directamente al marco. De forma predeterminada, el marco maneja las excepciones y las convierte en la respuesta correcta durante las pruebas. Una vez más, sin embargo, es posible que no desee ver la respuesta convertida, sino la excepción completa. En este caso, puede hacer uso de esa llamada a $ this-> withoutExceptionHandling () para obtener el resultado deseado.