Eminson Mendoza
Ejemplo:
Automatizar la verificación de rutas protegidas es una de las prácticas más valiosas cuando trabajas con Laravel. En lugar de abrir el navegador una y otra vez para comprobar que un usuario sin sesión no pueda acceder a ciertas páginas, puedes escribir pruebas que lo hagan por ti y que además queden documentadas en tu proyecto para siempre.
¿Cómo funciona el testing de rutas como si fuera una receta?
El enfoque más sencillo para entender el testing es pensarlo como una receta paso a paso [0:01]. Primero abres el navegador, luego colocas la URL, presionas enter y esperas una respuesta. Exactamente eso es lo que se configura línea a línea dentro de un archivo de prueba: una descripción ordenada de lo que debería ocurrir.
Cuando un usuario invitado —es decir, alguien que no ha iniciado sesión— intenta acceder a una ruta protegida, lo esperado es que el sistema lo redirija al login. Esa expectativa se traduce directamente en código de prueba.
¿Cómo crear el archivo de prueba para un controlador?
El comando utilizado es php artisan make:test seguido de la ruta que refleja la estructura de carpetas del proyecto [1:06]:
bash php artisan make:test Controllers/RepositoryControllerTest
Esto genera el archivo dentro de tests/Feature/HTTP/Controllers/, manteniendo coherencia con la organización de app/HTTP/Controllers. Dentro del archivo se incluyen las configuraciones habituales para pruebas de tipo feature, como el uso de RefreshDatabase y WithFaker [1:48].
¿Qué se prueba cuando un invitado visita rutas protegidas?
Se configuran siete verificaciones, una por cada ruta que genera un controlador CRUD [2:17]. La primera prueba valida que al visitar el index de repositorios sin sesión activa, ocurra una redirección al login:
php $this->get(route('repositories.index')) ->assertRedirect('login');
Al ejecutar php artisan test por primera vez, la prueba falla con un 404 porque la ruta aún no existe [3:05]. Esto es completamente normal y forma parte del flujo conocido como red-green testing: primero falla, luego se corrige.
¿Cómo configurar las rutas de recursos con middleware de autenticación?
Para crear las siete rutas de un CRUD de forma automática se utiliza Route::resource en el archivo de rutas [3:20]:
php Route::resource('repositories', RepositoryController::class) ->middleware('auth');
El middleware auth protege de manera automática las siete rutas que se generan: index, show, create, store, edit, update y destroy [3:50]. Al asignar el middleware a nivel de recurso completo, no es necesario proteger cada ruta individualmente.
También es necesario crear el controlador si no existe:
bash php artisan make:controller RepositoryController --resource
Tras crear el controlador y corregir un pequeño error tipográfico en el nombre de la ruta [4:33], al ejecutar nuevamente las pruebas el resultado es exitoso: la ruta redirige correctamente al login.
¿Por qué probar las siete rutas del CRUD individualmente?
Aunque la protección se configura en una sola línea con el middleware, cada ruta se prueba por separado [5:15]. Las verificaciones cubren:
GET a la lista de repositorios.GET.GET.PUT.DELETE.GET.POST.Cada una espera una redirección al login cuando no hay sesión activa [6:10]. La razón de probar individualmente es que en el futuro otro programador podría separar esa única línea de middleware en configuraciones independientes para cada ruta. Al tener las siete pruebas escritas, cualquier cambio que rompa la protección será detectado de inmediato.
Para visualizar todas las rutas disponibles y confirmar su existencia, se puede ejecutar:
bash php artisan route:list
Este comando muestra el listado completo con métodos HTTP, URIs y nombres asignados [5:30].
El valor real de estas pruebas está en la automatización: lo que normalmente harías manualmente en el navegador —verificar redirecciones, comprobar códigos de estado— queda descrito en un archivo que puedes ejecutar con un solo comando cuantas veces necesites. ¿Ya estás aplicando testing en tus proyectos Laravel? Comparte tu experiencia.
Eminson Mendoza
Ejemplo:
Edgar Alejandro España Amaya
Para los que quieran conocer un poco mas sobre el sistemas de autenticación sanctum, de verdad es un tema muy interesante =>
Mariano Gastón Paduani
gracias!
Jineth Daniela Granados Leguizamon
estos test son solo para el desarrollo verdad...en modo produccion no funcionan
Carlos Eduardo Gomez García
Así es, usualmente tú quieres tener tus tests mientras desarrollas para probar que todo funcione, en producción son muy poco útiles porque ahí ya sabes que todo funciona :D
Jimmy Buriticá Londoño
Te aclaro que la carpeta /tests no se pasa a producción, esto quiere decir que estos tests solo están disponibles en un ambiente de desarrollo.
Luis Cano
Solo mencionar que para esta parte del test no es necesario tener el controlador creado, al tener el middleware('auth') podemos pasar un nombre de controlador no existente y la prueba será exitosa de cualquier forma.
José Reinaldo Duque Serna
Una forma de crear el controlador RepositoryController con los métodos preconfigurados es usando la opción --model=Repository
php artisan make:controller RepositoryController --model=Repository
Sergio Andrés Barragan
buen aporte!!
Mariano Gastón Paduani
gracias!
Dave Juanes
Alguien pudo solucionar el warning:
TTY mode is not supported on Windows platform.
Santiago Velásquez Serna
En realidad creo que no importa que hagamos una sola verificación o las 7. Puesto que el middleware va a redirigir con solo ver la palabra repositories y al ver que el usuario no esta logueado.
Es mas, puedes poner en vez de "repositories/create", una ruta invalida como "repositories/Asdas d a sd asd" e igual el test va a pasar porque no alcanza a verificar si la ruta completa existe o no.
Igual sigue siendo un muy buen ejercicio recordar las rutas basicas de los controladores y practicar.
Kenneth Angulo L
Santiago Velásquez Serna
Para crear con un solo comando la migración, la fabrica, el modelo y el controlador, podemos ejecutar:
php artisan make:model -mfc --resource
Kenneth Angulo L
Ya que hablamos de rutas les dejo por aqui varias formas de comprobar los codigos de error:
Buenos dias.
Si hay diferencia en cada validacion, cada linea prueba una ruta y metodo especifico.
En el ejemplo: "repositories/Asdas d a sd asd" no se esta probando la ruta para create, el router busca "Asdas d a sd asd" como un recurso, es decir se interpreta como la ruta show.
Pruebas:
public function test_guest(): void { $this->get('repositories')->assertRedirect('login'); // index // $this->get('repositories/1')->assertRedirect('login'); // show $this->get('repositories/1/edit')->assertRedirect('login'); // edit $this->put('repositories/1')->assertRedirect('login'); // update $this->delete('repositories/1')->assertRedirect('login'); // destroy $this->get('repositories/Asdas d a sd asd')->assertRedirect('login'); // create $this->post('repositories', [])->assertRedirect('login'); // guardar } // En el archivo web.php Route::resource('repositories', RepositoryController::class)->except('show')->middleware('auth'); ```Lo anterior ocaciona que la prueba falle, y evidencia que 'Asdas...' esta siendo interpretado como un recurso buscado mediante el metodo get: ```js FAILED Tests\Feature\Controllers\RepositoryControllerTest > guest Expected response status code [201, 301, 302, 303, 307, 308] but received 405. Failed asserting that false is true. at tests\Feature\Controllers\RepositoryControllerTest.php:18 14▕ // $this->get('repositories/1')->assertRedirect('login'); // show 15▕ $this->get('repositories/1/edit')->assertRedirect('login'); // edit 16▕ $this->put('repositories/1')->assertRedirect('login'); // update 17▕ $this->delete('repositories/1')->assertRedirect('login'); // destroy ➜ 18▕ $this->get('repositories/Asdas d a sd asd')->assertRedirect('login'); // create 19▕ $this->post('repositories', [])->assertRedirect('login'); // guardar 20▕ 21▕ } 22▕ }