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 个问题
- 您不能将
->shouldReceive
直接链接到 Mockery::mock
的 return 值
- 闭包中缺少
\
工作示例:
$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();
我正在尝试编写一些单元测试以确保我的路由不会被意外重写。我已经找到了检查是否将正确的控制器分配给特定路线的答案
不过,我还想检查是否为路由分配了正确的中间件。我用
尝试了类似的方法$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 个问题
- 您不能将
->shouldReceive
直接链接到Mockery::mock
的 return 值
- 闭包中缺少
\
工作示例:
$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();