【问题标题】:Laravel feature test using middleware使用中间件进行 Laravel 功能测试
【发布时间】:2022-01-22 17:50:30
【问题描述】:

我正在尝试对我的 Laravel 应用程序的起始页进行功能测试。

路线:

Route::domain('{subdominio}.'.env("APP_DOMAIN"))->middleware('mapNumserie')->group(function () {
    Route::get('/', 'FarmaciaController@show')->middleware('modomtofarmacia')->name('inicio');
})

由于某些原因,我使用 middleware mapNumserie 在其中将子域 aganist 映射为序列号 $idfarmacia 以便在控制器中使用它:

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);
}

在我的 ModoMtoFarmacia 中间件中,我只是检查应用实例是否处于维护模式或禁用:

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);
        }
    }

在我的控制器中,使用$idfarmacia 获取一些数据并返回一个视图:

public function show(Request $request, $idfarmacia) {
    $data = 
        //Query...
    if($data){
        return view('inicio', ['data' => $data]);
    }
    else{
        abort(404);
    }

}

我希望通过一个非常简单的 test 方法来验证 200 响应:

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

但是当我运行测试时,我得到了:

Expected response status code [200] but received 404.

使用的 URL 在 web 环境中可以正常工作,但测试失败。我哪里错了?

【问题讨论】:

  • 您可以在您的代码中调试,在您的条件之前检查 $idfarmacia 是否不为空,和/或在中间件中调试进程
  • 好的,我做到了。 $route = $request->route() 在中间件中获取 '/' 值。我不知道原因。
  • 我应该如何构建路线?或者我应该如何构建测试来验证该路线?
  • 我测试了你的中间件“mapNumserie”,我一直都有“/”。我不明白它是如何工作的。我想我遗漏了一些信息

标签: laravel laravel-middleware laravel-testing


【解决方案1】:

终于在我的phpunit.xml 设置中发现了问题,这导致了第一个查询中的错误(也在任何其他查询中),在这种情况下是在 MapNumserie 中间件中找到的:

 $idfarmacia = \App\Farmacia::where('subdominio', $route->subdominio)->value('numserie');

我必须正确设置 DB_DATABASEDB_CONNECTION 的值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-05
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    相关资源
    最近更新 更多