Reparación de pruebas rotas a medida que se agregan funciones


Este tutorial agregará el concepto de hilos que tienen un canal al que pertenecen. Sin embargo, aquí viene el desafío. En este punto, nuestra base de datos no admite esa capacidad. Por lo tanto, a medida que comenzamos a agregar esta función, las cosas comenzarán a romperse. Dado que hemos estado construyendo pruebas todo el tiempo, sabremos dónde se están rompiendo las cosas en función de las pruebas que comienzan a fallar. Así que intentemos agregar el código para admitir canales, veamos qué se rompe y luego arreglemos en el camino.


Refactorizar dos pruebas en una

Ahora mismo tenemos dos pruebas que hacen lo mismo. Tenemos test_guest_can_not_create_threads () así como test_guest_can_not_see_thread_create_form () pero se superponen solo un poco. Fusionémoslos en una función. Primero veremos lo que tenemos actualmente y luego veremos cómo refactorizar estas dos pruebas en una.

Después de un poco de refactorización, podemos limpiar estas dos pruebas en una sola prueba aquí.

En realidad, no necesitamos la llamada a $ this-> withExceptionHandling () porque en realidad está activada de forma predeterminada. La única vez que necesitamos hacer una llamada a $ this-> withExceptionHandling () es si ya hicimos una llamada a $ this-> withoutExceptionHandling () y nos gustaría volver a activarla. Entonces, esta rápida refactorización hace que nuestro archivo de prueba sea un poco más limpio. Consulte la publicación sobre cómo alternar el manejo de excepciones para obtener más información.


Canales para hilos

Tal como está ahora, cuando se hace un poste de hilo, simplemente entra en un gran cubo. No hay categorías ni canales de los que hablar. Es probable que esté familiarizado con el concepto de publicar en una categoría en particular cuando visita un foro. Necesitamos implementar de alguna manera este concepto de canales. Cada hilo debe pertenecer a un canal. Después del desarrollo basado en pruebas, veamos cómo comenzar a escribir una prueba para desarrollar esta función.

Podemos abrir nuestro archivo ThreadTest.php que es parte de nuestra carpeta Unit Tests. Queremos afirmar que un hilo es una instancia de Channel. En nuestro código, eso puede verse así:

Podemos ejecutar la prueba usando la bandera de filtro una vez más para probar solo nuestra nueva prueba.

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

E 1/1 (100%)

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

Hubo 1 error:

1) Pruebas \ Unidad \ ThreadTest :: test_a_thread_belongs_to_a_channel
PHPUnit \ Framework \ Exception: Argument # 1 (Sin valor) de PHPUnit \ Framework \ Assert :: assertInstanceOf () debe ser un nombre de clase o interfaz

/home/vagrant/Code/forumio/tests/Unit/ThreadTest.php:45

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

Por supuesto, esperábamos que esto fallara, pero es bueno familiarizarse con los errores que podemos ver en varias situaciones. En este caso, ni siquiera tenemos una clase de canal todavía, así que, por supuesto, tendremos que crear una. Construyamos esa clase ahora. Crearemos un nuevo modelo y agregaremos la marca -m para incluir una migración también.

vagrant @ homestead: ~ / Code / forumio $ php artisan make: model Channel -m
Modelo creado con éxito.
Migración creada: 2017_12_20_225927_create_channels_table

Ahora tenemos una clase de canal, así que ejecutemos la prueba nuevamente para ver qué sucede.

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

F 1/1 (100%)

Tiempo: 718 ms, memoria: 8,00 MB

Hubo 1 falla:

1) Pruebas \ Unidad \ ThreadTest :: test_a_thread_belongs_to_a_channel
No se pudo afirmar que null es una instancia de la clase "App \ Channel".

/home/vagrant/Code/forumio/tests/Unit/ThreadTest.php:45

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

La prueba aún falla, pero el mensaje de error es diferente. Esta vez, vemos que la prueba no ha podido afirmar que null es una instancia de la clase Channel. Ok, parece que nos falta una relación en la clase Thread. Dijimos que un hilo debería tener un canal. En otras palabras, un hilo pertenece a un canal. Agreguemos esa relación.

Ejecutamos la prueba nuevamente, pero obtenemos el mismo mensaje de error. Bueno, también debemos tener en cuenta la relación en la tabla de la base de datos de subprocesos. Cada hilo debe tener un channel_id asociado. Necesitamos actualizar ese archivo de migración así:

¡Aviso! También vamos a necesitar actualizar nuestra fábrica de modelos para que un hilo refleje los cambios que hemos realizado; de lo contrario, fallará la creación de nuevos hilos para las pruebas.

Podemos volver a ejecutar la prueba para ver si hemos progresado.

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

E 1/1 (100%)

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

Hubo 1 error:

1) Pruebas \ Unidad \ ThreadTest :: test_a_thread_belongs_to_a_channel
InvalidArgumentException: No se puede ubicar la fábrica con el nombre [predeterminado] [App \ Channel].

La fábrica de hilos parece estar bien, pero nos falta una fábrica de canales real. Sin embargo, podemos crear uno, ¡así que no temas! El canal constará de un nombre y una babosa.

Ejecutar las pruebas nuevamente nos mostrará cómo están progresando las cosas.

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

E 1/1 (100%)

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

Hubo 1 error:

1) Pruebas \ Unidad \ ThreadTest :: test_a_thread_belongs_to_a_channel
Illuminate \ Database \ QueryException: SQLSTATE [HY000]: Error general: 1 tabla de canales no tiene nombre de columna (SQL: insertar en "canales" ("nombre", "slug", "updated_at", "created_at") valores (error , error, 2017-12-21 00:01:17, 2017-12-21 00:01:17))

Recibimos un error sobre el nombre de una columna que falta en la tabla de la base de datos. Esto tiene sentido ya que nunca construimos nuestra tabla en la migración de un canal. Necesitamos corregir esto. Continúe y abra la migración CreateChannelsTable y podemos actualizar el archivo como vemos aquí:

Hagamos esa prueba una vez más. ¡Creo que podríamos tener mejor suerte!

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

. 1/1 (100%)

Tiempo: 992 ms, memoria: 8,00 MB

OK (1 prueba, 1 afirmación)

¡Finalmente! Esta es una buena demostración del ciclo de desarrollo basado en pruebas. Se corrige un error a la vez hasta que finalmente se aprueba la prueba.


Comprobación de todas las pruebas

Hemos incorporado esta nueva característica de un canal a nuestras pruebas, y esa prueba en particular pasa. Probablemente deberíamos ejecutar ahora todo el conjunto de pruebas para asegurarnos de que todo se mantiene unido.

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

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

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

Hubo 1 falla:

1) Pruebas \ Característica \ CreateThreadsTest :: test_a_logged_in_user_can_create_new_threads
No se pudo afirmar que (el html) contiene "Qui dolorem laborum reiciendis ut.".

Vemos que el test_a_logged_in_user_can_create_new_threads () ahora está fallando. ¿Por qué? Falla porque ahora necesitamos un nuevo hilo para tener un channel_id asociado, pero esto aún no está en su lugar, por lo que debemos solucionarlo. Esto estará en el método store () del ThreadsController. Aquí agregamos una referencia al channel_id al crear un nuevo hilo.

Vuelva a ejecutar todas las pruebas.

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

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

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

OK (13 pruebas, 19 afirmaciones)

¡Si! Todas las pruebas están pasando de nuevo.


Actualización de la ruta de la cadena

Tendremos que tener en cuenta el hecho de que el método path () actual solo proporciona la identificación de un hilo. También debe tener en cuenta nuestra nueva capacidad de incluir un canal para cada hilo. Podemos comenzar creando una prueba para esto. Agregaremos esto en nuestra clase ThreadTest.