Hemos hablado un poco sobre las funciones de ayuda en Laravel antes. En este tutorial, echemos un vistazo a la creación de algunas funciones auxiliares para nuestras clases de prueba. Esencialmente, todo lo que queremos hacer es tomar parte del código repetitivo que vemos en nuestras pruebas y resumir esos fragmentos en algunas funciones a las que podemos hacer referencia fácilmente para ayudar a limpiar un poco las cosas. Lo haremos de modo que tengamos menos escritura y una creación de clases de prueba más fácil utilizando una combinación de funciones auxiliares y plantillas en vivo en PHP Storm. Echemos un vistazo a cómo podemos hacer esto ahora.


Agregar pruebas para crear subprocesos

Antes de comenzar nuestra refactorización, sigamos adelante y agreguemos una prueba para crear nuevos hilos.

vagrant @ homestead: ~ / Code / forumio $ php artisan make: prueba CreateThreadsTest
Prueba creada con éxito.

Rápidamente eliminamos nuestra primera prueba y la llamamos test_a_logged_in_user_can_create_new_threads (). Al igual que todas nuestras otras pruebas, primero tenemos que preguntarnos, ¿qué estamos tratando de probar y cómo podemos hacer esto? Bueno, el pseudocódigo puede verse así.

  • Dado que hay un usuario registrado
  • Cuando se visita el punto final para crear un nuevo hilo
  • Entonces se ve la página del hilo
  • Debería haber un nuevo hilo

Ejecute la prueba para ver dónde estamos.

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

E 1/1 (100%)

Tiempo: 687 ms, memoria: 6,00 MB

Hubo 1 error:

1) TestsFeatureCreateThreadsTest :: test_a_logged_in_user_can_create_new_threads
IlluminateDatabaseQueryException: SQLSTATE [HY000]: Error general: 1 no existe tal tabla: usuarios (SQL: insertar en "usuarios" ("nombre", "correo electrónico", "contraseña", "recordar_token", "actualizado_en", "creado_en") valores (Arnoldo Howe, kale01@example.net, $ 2y $ 10 $ LT7lrCFwUNExvHIcu7gKeOBxr61R.TlWyIVzpdjUITPuh5qOHmiEK, iA7enRtnGP, 2017-12-19 15:29:30, 2017-12-19 15:29:30))

Este error nos dice que nos falta el rasgo de migraciones que hemos estado usando hasta ahora. Incluyémoslo en nuestro archivo de prueba.

Podemos ejecutar la prueba nuevamente y ver cómo va.

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

E 1/1 (100%)

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

Hubo 1 error:

1) TestsFeatureCreateThreadsTest :: test_a_logged_in_user_can_create_new_threads
SymfonyComponentHttpKernelExceptionMethodNotAllowedHttpException:

Este error indica que falta una ruta. Este es fácil de solucionar, sigamos adelante y agreguemos la ruta que necesitamos.

Por supuesto, también necesitaremos completar el método de almacenamiento en nuestro ThreadsController, así que abordemos eso aquí.

Frio. Ejecutemos nuestra prueba y veamos cómo funciona.

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

E 1/1 (100%)

Tiempo: 1 segundo, memoria: 8,00 MB

Hubo 1 error:

1) TestsFeatureCreateThreadsTest :: test_a_logged_in_user_can_create_new_threads
Error: llamada al método no definido TestsFeatureCreateThreadsTest :: assertSee ()

/home/vagrant/Code/forumio/tests/Feature/CreateThreadsTest.php:28

¡ERRORES!
Pruebas: 1, afirmaciones: 0, errores: 1.

Hmmm. Llamada al método indefinido assertSee (). ¿Qué salió mal? Oh, sí, tenemos que arreglar nuestra prueba así:

Ejecutar nuestra prueba ahora nos da un resultado positivo. ¡Agradable!

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

. 1/1 (100%)

Tiempo: 967 ms, memoria: 8,00 MB

OK (1 prueba, 1 afirmación)

Pruebe para asegurarse de que los invitados no puedan publicar hilos

En la primera sección, tenemos una pequeña prueba que cubre el escenario de un usuario registrado que publica un nuevo hilo. Nuestra prueba está funcionando, así que todo está bien. También deberíamos crear una prueba en la que demostremos que un usuario invitado no puede publicar un nuevo hilo. ¿Cómo podemos hacer esto? Veamos.

Ejecutar esta clase de prueba ahora nos da una prueba que pasa y otra que falla.

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

. 1/1 (100%)

Tiempo: 967 ms, memoria: 8,00 MB

OK (1 prueba, 1 afirmación)
vagabundo @ homestead: ~ / Code / forumio $ clear
vagabundo @ homestead: ~ / Code / forumio $ phpunit --filter CreateThreadsTest
PHPUnit 6.5.4 por Sebastian Bergmann y colaboradores.

E. 2/2 (100%)

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

Hubo 1 error:

1) TestsFeatureCreateThreadsTest :: test_guest_can_not_create_threads
IlluminateDatabaseQueryException: SQLSTATE [23000]: Violación de restricción de integridad: 19 NOT NULL restricción fallida: threads.user_id (SQL: insert into "threads" ("user_id", "title", "body", "updated_at", "created_at") valores (, Nam similique doloremque voluptatem laborum aut qui., Ipsam amet placeat repellat assumenda sit tempore. Doloribus quis ut placeat quod., 2017-12-19 16:12:48, 2017-12-19 16:12:48))

Entonces parece que todavía está intentando crear el hilo. Llegamos al método e intenta construir la consulta SQL, pero nos falta una identificación de usuario. Bueno, en realidad no tenemos una identificación de usuario porque este es un invitado en este caso. Podemos solucionar este problema con nuestro buen amigo Middleware.

Ejecute la prueba de nuevo y obtendremos un error no autenticado.

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

E. 2/2 (100%)

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

Hubo 1 error:

1) TestsFeatureCreateThreadsTest :: test_guest_can_not_create_threads
IlluminateAuthAuthenticationException: no autenticado.

Ok, tiene sentido. Esto es realmente lo que queremos. Podemos modificar nuestra prueba para esperar esta excepción, y luego nuestra prueba debería pasar.

¡Bingo! Nuestra prueba ahora pasa.

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

.. 2/2 (100%)

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

OK (2 pruebas, 2 afirmaciones)

Crear ayudantes de prueba

Ahora que hemos agregado esas pruebas, podemos limpiar algunas cosas con ayudantes. Actualicemos nuestro archivo composer.json para que sea compatible con esto así:

    "autoload-dev": {
        "psr-4": {
            "Pruebas \": "pruebas /"
        },
        "archivos": ["pruebas / utilidades / funciones.php"]
    },

Ahora podemos crear ese directorio y archivo también:
ayudantes de prueba de laravel

Completemos ese archivo functions.php así:

Con estos ayudantes, ahora podemos intercambiar parte del código de nuestros archivos de prueba con versiones más simplificadas. Por ejemplo factory('AppThread')->make(), ahora se puede reemplazar con make('AppThread')Además, factory('AppUser')->create()se puede reemplazar con create('AppUser').

Debemos asegurarnos de ejecutar un composer dumpcomando con el nuevo archivo de ayuda en su lugar, de lo contrario, podemos ver un error como este:

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

F. 2/2 (100%)

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

Hubo 1 falla:

1) TestsFeatureCreateThreadsTest :: test_guest_can_not_create_threads
No se pudo afirmar que la excepción de tipo "Error" coincide con la excepción esperada "IlluminateAuthAuthenticationException". El mensaje era: "Llamada a la función no definida TestsFeaturemake ()" en
/home/vagrant/Code/forumio/tests/Feature/CreateThreadsTest.php:18
.

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

Sin embargo, una vez que ejecutamos ese volcado del compositor para reconstruir los archivos de carga automática, estamos listos para comenzar como vemos aquí:

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.
vagabundo @ homestead: ~ / Code / forumio $ phpunit --filter CreateThreadsTest
PHPUnit 6.5.4 por Sebastian Bergmann y colaboradores.

.. 2/2 (100%)

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

OK (2 pruebas, 2 afirmaciones)
vagabundo @ homestead: ~ / Código / forumio $

Creación de un asistente de signIn ()

En la sección anterior creamos pequeñas funciones de atajo para crear fábricas de modelos. Este fragmento facilitará mucho la creación de un usuario que haya iniciado sesión para nuestras pruebas. Podemos refactorizar el archivo TestCase.php para que admita esto así:

Una vez más, podemos limpiar nuestros archivos de prueba. Con este código, podemos intercambiar instancias de $this->actingAs(create('AppUser'))con $this->signIn().


Crear una plantilla en vivo en PHP Storm

Una cosa más que podemos hacer para ayudar a optimizar nuestras pruebas es configurar una plantilla en vivo en PHP Storm para crear automáticamente una clase de prueba basada en nuestras necesidades. Veamos si podemos hacer que esto funcione. Primero, creemos un código auxiliar de prueba rápido que podamos usar.

vagrant @ homestead: ~ / Code / forumio $ php artisan make: test FooTest
Prueba creada con éxito.

Ahora, continúe y tome el contenido de FooTest.php y cópielo / péguelo en PHP Storm en plantillas en vivo.
php storm agregar plantilla en vivo

Una vez que haga clic en Plantilla en vivo para agregar la plantilla en vivo, debemos completar la abreviatura, la descripción y pegar el código de nuestra plantilla.
completar la abreviatura y la descripción de las plantillas en vivo

Asegúrese de definir los contextos aplicables y de cambiar el formato de acuerdo con las opciones de estilo. Para nuestros propósitos, elegiremos "En todas partes" para la definición de contexto. Ahora, si tenemos un archivo en blanco, deberíamos poder escribir testclassy luego presionar la tecla de tabulación para completar algunas pruebas repetitivas.

plantilla en vivo en acción


Detectar nombres de archivos automáticamente

Nuestra plantilla en vivo es genial en este momento, pero mejorémosla. Queremos que la plantilla en vivo asigne un nombre a la clase automáticamente según el nombre del archivo que tenemos. Entonces, si tenemos un archivo llamado BarTest.php, y luego escribimos testclass tab en el editor, se completará el texto estándar basado en el nombre del archivo. En la configuración de la plantilla en vivo de PHP Storm, podemos cambiar el nombre de clase de nuestro marcado de FooTest a $ CLASS $. Luego elegimos "editar variables" y actualizar la definición de clase para usar el nombre del archivo sin extensión.
Variables de edición de plantilla de phpstorm

Ahora podemos crear un nuevo archivo, y luego escribir testclass y luego la tecla de tabulación para completar automáticamente todo por nosotros.
crear un nuevo archivo de prueba
clase de nombre automático del nombre del archivo


Resumen de ayudantes de prueba de Laravel

Este fue un pequeño tutorial agradable que nos hizo construir algunas pruebas para crear subprocesos, seguido de algunas formas útiles de refactorizar el código de prueba para que sea más fácil escribir nuestros casos de prueba. Primero creamos un par de ayudantes de prueba en forma de funciones que cargamos automáticamente solo en modo de desarrollo. Estas funciones nos permiten utilizar una buena forma abreviada de crear o crear usuarios o hilos. Después de esto, nos sumergimos en plantillas en vivo en PHP Storm. Pudimos configurar una buena plantilla en vivo que usa el nombre del archivo base como el nombre de la clase cuando creamos una nueva prueba. Al escribir nuestra palabra de activación, en nuestro caso testclass, seguida de la tecla de tabulación, obtenemos la población automática de algún código repetitivo útil. Estos pasos harán que sea más fácil y rápido seguir escribiendo pruebas a medida que avanzamos.