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:
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 dump
comando 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.
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.
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 testclass
y luego presionar la tecla de tabulación para completar algunas pruebas repetitivas.
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.
Ahora podemos crear un nuevo archivo, y luego escribir testclass y luego la tecla de tabulación para completar automáticamente todo por nosotros.
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.
0 Comentarios