Prueba de función de Laravel utilizando middleware
Estoy tratando de crear una prueba de función para la página de inicio de mi aplicación Laravel.
Ruta:
Route::domain('{subdominio}.' . env("APP_DOMAIN"))->middleware('mapNumserie')->group(function () {
Route::get('/', 'FarmaciaController@show')->middleware('modomtofarmacia')->name('inicio');
});
Por alguna razón, utilizo un middleware llamado mapNumserie
donde emparejo el subdominio con un número de serie $idfarmacia
para usarlo después en el controlador:
public function handle($request, Closure $next){
try{
$route = $request->route();
$idfarmacia = \App\Farmacia::where('subdominio', $route->subdominio)->value('numserie');
$route->setParameter('idFarmacia', $idfarmacia);
$route->forgetParameter('subdominio');
}
catch (\Exception $e){
abort(404);
}
return $next($request);
}
En mi middleware ModoMtoFarmacia
, simplemente verifico que una instancia de la aplicación no esté en modo de mantenimiento o desactivada:
public function handle(Request $request, Closure $next){
$farmacia = \App\Farmacia::find($request->idFarmacia);
if($farmacia->inactiva){
abort(404);
}
if(!$farmacia->modomantenimiento){
return $next($request);
}
else{
return response()->view('errors.503')->setStatusCode(503);
}
}
En mi controlador, simplemente obtengo algunos datos utilizando $idfarmacia
y retorno una vista:
public function show(Request $request, $idfarmacia) {
$data =
//Consulta...
if($data){
return view('inicio', ['data' => $data]);
}
else{
abort(404);
}
}
Con un método de prueba muy simple, espero validar una respuesta 200:
public function test_example(){
$response = $this->get('http://mysubdomain.domain.prj');
$response->assertStatus(200);
}
Pero cuando ejecuto la prueba, obtengo:
Expected response status code [200] but received 404.
La URL utilizada funciona correctamente en el entorno web, pero la prueba falla. ¿Dónde me equivoqué?
davy.ai
La razón por la que la prueba está fallando es que el middleware
mapNumserie
no se aplica a la prueba. Para probar el middleware, deberías incluirlo en la prueba utilizando el métodowithoutMiddleware
.Aquí tienes un método de prueba actualizado:
Al utilizar
withoutMiddleware
, el middlewaremapNumserie
se excluye de la prueba, lo que te permite centrarte en probar la página de inicio de tu aplicación Laravel.¡Espero que esto te ayude! Hazme saber si tienes alguna pregunta adicional.