Laravel 中用于路由测试的模拟中间件

Mock Middleware for route testing in Laravel

我正在尝试编写一些单元测试以确保我的路由不会被意外重写。我已经找到了检查是否将正确的控制器分配给特定路线的答案 .

不过,我还想检查是否为路由分配了正确的中间件。我用

尝试了类似的方法
$tmp = new CorsService;
$corsMiddleware = Mockery::mock('Barryvdh\Cors\HandleCors[handle]', array($tmp))
    ->shouldReceive('handle')->once()
    ->andReturnUsing(function($request, Closure $next) {
        return $next($request);
    });

\App::instance('Barryvdh\Cors\HandleCors', $corsMiddleware);

出于某种原因,测试没有发现这一点。我假设这是因为中间件实例未使用 App::instance.

存储

我做错了什么?

所以我发现上面的代码有 2 个问题

  1. 您不能将 ->shouldReceive 直接链接到 Mockery::mock
  2. 的 return 值
  3. 闭包中缺少 \

工作示例:

$tmp = new CorsService;
$corsMiddleware = Mockery::mock('Barryvdh\Cors\HandleCors[handle]', array($tmp));
$corsMiddleware->shouldReceive('handle')->once()
    ->andReturnUsing(function($request, \Closure $next) {
        return $next($request);
    });

\App::instance('Barryvdh\Cors\HandleCors', $corsMiddleware);

尝试获取路由并检查它们的中间件

// Get Routes
    foreach (Route::getRoutes() as $route) {
        $middleware = $route->gatherMiddleware();
        $name = $route->getName();
        \Log::debug($name.'--');
        \Log::debug($middleware);
    }

不要忘记在最后使用 ->getMock(),如果您要将 ->shouldReceive 之类的东西直接链接到您的 Mock 对象:

$corsMiddleware = Mockery::mock('Barryvdh\Cors\HandleCors[handle]', array($tmp))
    ->shouldReceive('handle')->once()
    ->andReturnUsing(function($request, Closure $next) {
        return $next($request);
    })
    ->getMock();