【问题标题】:Problems on testing middleware in Laravel with Clousure $next在 Laravel 中使用 Clousure $next 测试中间件的问题
【发布时间】:2019-12-07 17:49:09
【问题描述】:

我的应用上有这个中间件,用于检查用户角色的路由:

public function handle($request, Closure $next, ...$roles)
{
   if (in_array($request->user()->rol, $roles)) {
        return $next($request);
   } else {
        return redirect()->action('SecurityController@noAutorizado');
   }
}

我正在尝试对此中间件 (phpUnit) 进行测试:

    public function testUsuarioLogadoPuedeAccederAPantallaUsuarios()
{

    $user = UsuariosTestFixtures::unAsignador();
    $this->actingAs($user);
    $request = Request::create('/usuarios', 'GET');

    $middleware = new CheckRole();
    $response = $middleware->handle($request,Closure $next,$user->getRole(), function () {});
    $this->assertEquals($response, true);

}

但是我正在检索这个错误:传递给 App\Http\Middleware\CheckRole::handle() 的参数 2 必须是 Closure 的一个实例,给定 null

我不知道如何通过 $middleware->handle 上的“Closure $next”

我试过这个:

public function testUsuarioLogadoPuedeAccederAPantallaUsuarios(Closure $next){...}

但它返回错误:函数 UsuarioControllerTest::testUsuarioLogadoPuedeAccederAPantallaUsuarios() 的参数太少,在 C:\www\APPS\catsa\vendor\phpunit\phpunit\src\Framework\TestCase.php 中传递了 0

解决办法是什么?

非常感谢!

【问题讨论】:

  • 在第二个代码块中,你在哪里看到$next
  • @Mike,什么?我不明白这个问题,对不起。

标签: testing laravel-5 phpunit middleware laravel-middleware


【解决方案1】:

PHP 中的Closure 只是一个函数,因此您需要传递一个函数作为handle 方法的第二个参数。

在 Laravel 中间件的上下文中,$next 函数代表了 request 所经过的完整步骤管道。

显然,您不能(也不需要)在测试期间执行此管道。您需要的只是一个返回一些值的函数,您可以在断言中进行测试。

你可以这样做:

//... setup code here


$middleware = new CheckRole();
$roles = ['role1', 'role2']; // change this with the desired roles
$result = $middleware->handle($request,function($request) {
    return 'success';
},$roles);

$this->assertEquals('success', $result);

那么,这里发生了什么?

如果一切按计划进行(用户具有所需角色),则执行$next 闭包并返回success;另一方面,如果用户没有所需的角色,则代码采用另一条路径并返回RedirectResponse

最后,断言检查是否返回了success,如果没有返回则报告失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-29
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多