Dado que estamos realizando un desarrollo basado en pruebas, necesitamos crear pruebas para las características antes de incluso crearlas. En este tutorial, eso es exactamente lo que haremos. Lo primero, o característica, que tendrá nuestro proyecto de foro es que un usuario puede ver hilos. Podemos navegar a la carpeta de pruebas y cambiar el nombre del modelo estándar ExampleTest.php a ThreadsTest.php. Sin embargo, antes de hacer eso, necesitaremos configurar nuestro entorno de prueba, por lo que ese será el primer paso.


Configurar pruebas de base de datos Sqlite en memoria

Para este paso, necesitamos configurar el archivo phpunit.xml . Podemos especificar los valores DB_CONNECTIONDB_DATABASEcomo se muestra.

Lo que esto le dice a Laravel es que cuando ejecutamos pruebas en la Unidad PHP, usará la opción Sqlite en la memoria.


Aproveche la característica de migraciones de bases de datos

En nuestras pruebas, podemos usar el rasgo de migraciones de bases de datos para realizar pruebas. De esta manera, para cada prueba que se ejecute, la base de datos se migrará si es necesario, se completarán o eliminarán los datos, y una vez que se complete la prueba, todo se revertirá. En realidad, esto es bastante bueno. Aquí está el código que impulsa esta función de migración.


Crear la primera prueba de funciones

Con estos elementos en su lugar ahora, podemos crear la primera prueba en nuestro archivo ThreadsTest.php. Queremos que los usuarios puedan navegar por los subprocesos, por lo que crearemos esta prueba con el nombre a_user_can_browse_threads. Esta es simplemente una función de la clase ThreadsTest. Aquí está el código con el que podemos empezar.

Hasta ahora, todo lo que dice esta prueba es que, cuando un usuario visita el punto final / threads, la respuesta debería ser 200 OK. Entonces podemos ejecutar la prueba.

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

W.2 / 2 (100%)

Tiempo: 646 ms, memoria: 6,00 MB

Hubo 1 advertencia:

1) Advertencia
No se encontraron pruebas en la clase "TestsFeatureThreadsTest".

¡ADVERTENCIAS!
Pruebas: 2, afirmaciones: 1, advertencias: 1.

Hmm, esperaba el fracaso, pero no ese. Veamos si podemos arreglar esto. Ok, interesante. Parece que necesitaba usar una convención de nomenclatura diferente en el nombre de la prueba de función. Perfecto, podemos actualizar nuestro nombre de prueba de a_user_can_browse_threads a test_a_user_can_browse_threads y deberíamos estar listos. Aquí está el caso de prueba actualizado.

Hagamos una vez más nuestra prueba.

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

F. 2/2 (100%)

Tiempo: 789 ms, memoria: 8,00 MB

Hubo 1 falla:

1) TestsFeatureThreadsTest :: test_a_user_can_browse_threads
Código de estado esperado 200 pero recibido 404.
No se pudo afirmar que lo falso es verdadero.

/home/vagrant/Code/forumio/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestResponse.php:78
/home/vagrant/Code/forumio/tests/Feature/ThreadsTest.php:19

¡FALLOS!
Pruebas: 2, afirmaciones: 2, fallas: 1.

Ah, ja. Fracasa. Recibimos un error de una mala respuesta 404. La respuesta 404 significa no encontrado, como aprendimos en nuestro tutorial de códigos de estado httpEsperábamos que esta prueba fallara porque ni siquiera tenemos una ruta para el punto final / threads. Entonces, con las pruebas, casi siempre la prueba falla al principio y luego seguimos arreglando pequeñas cosas hasta que la prueba finalmente pasa. Así que intentemos arreglar las cosas y hacer que esta prueba pase. Primero, podemos agregar la ruta.

Muy rápido, parece que cuando creamos nuestros controladores por primera vez no estaban en forma plural. Podemos solucionar eso con una refactorización rápida en PHP Storm. Asegúrese de completar este paso si lo está siguiendo.

Refactorizar ThreadController a ThreadsController
refactorizar para cambiar el nombre del controlador método 1

Refactorizar ReplyController a RepliesController
refactorizar para cambiar el nombre del controlador método 2

Con estos refactores en su lugar, simplemente agreguemos un fragmento rápido al método de índice en nuestro archivo ThreadsController para que podamos ejecutar la prueba nuevamente. Simplemente devolveremos la cadena de 'hola', y esto debería ser suficiente para generarnos un estado 200 OK.

Ejecutemos la prueba de nuevo.

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

F. 2/2 (100%)

Tiempo: 796 ms, memoria: 10,00 MB

Hubo 1 falla:

1) TestsFeatureThreadsTest :: test_a_user_can_browse_threads
Código de estado esperado 200 pero recibido 500.
No se pudo afirmar que lo falso es verdadero.

/home/vagrant/Code/forumio/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestResponse.php:78
/home/vagrant/Code/forumio/tests/Feature/ThreadsTest.php:19

¡FALLOS!
Pruebas: 2, afirmaciones: 2, fallas: 1.

¡¿Que?! Las cosas han ido de mal en peor. Inicialmente tuvimos un error debido a un mensaje 404 no encontrado. Ahora estamos reventando un código de estado completo 500, o en otras palabras, una falla catastrófica. En caso de duda, borre la memoria caché y realice un volcado del compositor.

vagrant @ homestead: ~ / Code / forumio $ php caché artesanal: borrar
La caché se borró correctamente.
vagrant @ homestead: ~ / Code / forumio $ composer dump
Generación de archivos de carga automática optimizados
> IlluminateFoundationComposerScripts :: postAutoloadDump
> Paquete artesanal @php: descubre
Paquete descubierto: fideloper / proxy
Paquete descubierto: laravel / tinker
El manifiesto del paquete se generó correctamente.

Hagamos esa prueba una vez más.

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

.. 2/2 (100%)

Tiempo: 669 ms, memoria: 8,00 MB

OK (2 pruebas, 2 afirmaciones)

¡AUGE! Por primera vez hasta ahora, pasamos la prueba. LOL. Por supuesto, sabemos que en realidad queremos que la prueba haga algo más que confirmar un código de estado 200 en la respuesta y lo abordaremos en breve. En este momento, usemos artisan para generar algunos andamios de autenticación para que podamos usar algo de ese html generado en nuestro proyecto. Cubrimos este tema en el tutorial de registro de usuarios de Laravel.

vagabundo @ homestead: ~ / Code / forumio $ php artisan make: auth
El andamio de autenticación se generó correctamente.

Esto crea páginas de inicio de sesión y registro de gran apariencia que son completamente funcionales para usted. Como puede ver, se ven bastante bien.
andamio de autenticación de inicio de sesión atractivo

Ahora, lo que vamos a hacer es crear el archivo de vista que necesitamos para nuestra prueba de subprocesos, y tomar prestado parte del marcado que se crea con los archivos de autenticación que acabamos de crear. Entonces, en el directorio / resources / views / threads podemos crear index.blade.php. Lo que podemos hacer ahora es abrir el archivo home.blade.php que se generó para nosotros, luego copiar y pegar en nuestro archivo mientras hacemos algunas modificaciones para que nos brinde un trabajo básico para nuestra vista.

Mientras estamos en eso, también arreglemos el método index () en nuestro ThreadsController. Lo que podemos hacer para comenzar es simplemente buscar todos los hilos de la base de datos, pasarlos a la vista y representarlos en la página. Aquí está nuestro controlador actualizado.

Con todo en su lugar, podemos volver a ejecutar nuestras pruebas en la Unidad PHP.

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

.. 2/2 (100%)

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

OK (2 pruebas, 2 afirmaciones)

¡Dulce! Pasamos como un jefe. Eso significa que podemos intentar cargar esa página en el navegador y debería funcionar. Probémoslo.
la prueba de subprocesos está funcionando en el navegador


Hacer que las pruebas sean más granulares

Entonces podemos ver que todo está funcionando hasta ahora tanto en nuestra prueba como en el navegador. La prueba tal como está ahora solo verifica un código de estado 200. Prácticamente si se carga alguna página, no importa cuál sea, obtendrá 200. Eso no es muy útil. Probablemente también deberíamos afirmar que la prueba verifica la salida correcta en la página y así sucesivamente. Ajustemos un poco nuestra prueba aquí.

Esto parece un poco más realista ahora. En nuestra función de prueba, ahora creamos un hilo y lo cargamos en la base de datos de prueba. Después de esto, enviamos una solicitud de obtención al punto final / threads y verificamos la respuesta. Esta vez, confirmamos o afirmamos que vemos el título real del hilo en la página. También continuamos afirmando que recibimos un mensaje de estado 200 OK. Podemos ejecutar las pruebas nuevamente y ver que todas las afirmaciones funcionan correctamente, lo cual es bueno.

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

.. 2/2 (100%)

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

OK (2 pruebas, 3 afirmaciones)

Prueba de función dos

Ok, me siento bastante bien con la configuración de la primera función con pruebas y construida para que funcione correctamente. Se aborda la función de un usuario puede navegar por los hilos. Ahora, creemos una nueva característicaLos usuarios también deberían poder ver un solo hilo. Después del desarrollo impulsado por pruebas, comenzaremos a crear la prueba, incluso antes de comenzar a desarrollar esa función. Podemos agregar el siguiente código a nuestra clase ThreadsTest para que esto funcione.

Al igual que en la primera prueba, ahora probamos la exploración de un hilo específico. Así que creamos un nuevo hilo, visitamos el punto final / threads / {id}, confirmamos que vemos el título y confirmamos que obtenemos un estado 200. Sabemos que esto fallará si lo probamos ahora mismo, pero sigamos adelante y probémoslo de todos modos. .

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

.F. 3/3 (100%)

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

Hubo 1 falla:

1) TestsFeatureThreadsTest :: test_a_user_can_read_a_single_thread
Falló afirmando que 'n
norte
    norte
        n
         n
         n
norte
        norte
norte
        n
         n
norte
        n
         n
    norte
    norte
        
norte
norte
norte Lo sentimos, no se pudo encontrar la página que estás buscando.
norte
norte
norte norte norte 'contiene "Praesentium corrupti quia excepturi ea ut placeat quo". /home/vagrant/Code/forumio/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestResponse.php:236 /home/vagrant/Code/forumio/tests/Feature/ThreadsTest.php:27 ¡FALLOS! Pruebas: 3, afirmaciones: 4, fallas: 1.

¡Vaya! Ese es un buen golpe ahí mismo. Lo que sucede aquí es que, dado que intentamos afirmar una cadena de texto en particular en la página, vemos esta gran mancha de html que se devuelve en los resultados de la prueba. Si observa detenidamente, puede ver que el mensaje principal es Fallido afirmando que (el html) contiene "Praesentium corrupti quia excepturi ea ut placeat quo". Muy bien, construyamos las tuberías que necesitamos para que esta prueba pase.

Necesitamos una ruta para esta función, así que agreguemos una ahora.

También necesitamos que se construya el método show (). Podemos hacerlo así para el método show () en ThreadsController. Tenga en cuenta que, dado que estamos inyectando un modelo como parámetro al método show, Laravel funcionará con un poco de magia con Route Model Binding .

Finalmente, necesitamos un archivo de vista para mostrar los resultados. Continúe y cree el archivo show.blade.php dentro del directorio resources / views / threads. Podemos rellenar el archivo así.

Todo está ahora en su lugar para nuestra segunda característica de que un usuario puede ver un solo hilo. Hagamos nuestras pruebas.

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

... 3/3 (100%)

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

OK (3 pruebas, 5 afirmaciones)

¡Frio! Parece que estamos pasando. Esto significa que ver un solo hilo en el navegador también debería funcionar. Cargar un hilo con el número de la suerte 7 para una identificación en el navegador funciona muy bien.
un usuario ve un solo hilo en el navegador


Agregar enlaces usando una función de ruta ()

Lo último que podemos hacer en este tutorial es agregar enlaces a la vista de índice para que cuando un usuario esté navegando por todos los hilos, pueda hacer clic en un enlace para ver un solo hilo. Modifiquemos nuestro archivo index.blade.php para hilos como ese.

Ese pequeño método path () es un truco para crear URL dinámicas automáticamente. Si intentamos cargar esto en el navegador ahora mismo, las cosas se van a romper. Necesitamos agregar esa función a nuestro modelo Thread para que funcione. Abre Thread.php y completa así.

Eso funcionará, y podemos ver que ver todos los hilos y luego hacer clic para ver más funciona muy bien.
navegando por todos y cada uno de los hilos en acción


Cómo crear una prueba de características en Laravel Resumen

Este tutorial nos permitió avanzar un poco más junto con la creación de nuevas funciones y asegurarnos de tener pruebas para admitir esas funciones a medida que avanzamos. Excelente trabajo para configurar la capacidad de un usuario para examinar todos los subprocesos y la prueba asociada, así como para crear la capacidad para que un usuario explore un solo subproceso con la prueba asociada también.