es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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é?

Tags:  , ,

Answer

  1. Avatar for 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étodo withoutMiddleware.

    Aquí tienes un método de prueba actualizado:

    public function test_example(){
        $response = $this->withoutMiddleware('mapNumserie')->get('http://mysubdomain.domain.prj');
        $response->assertStatus(200);
    }
    

    Al utilizar withoutMiddleware, el middleware mapNumserie 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.

Comments are closed.