如何让单元测试忽略 Laravel 中的中间件

abb*_*ood 1 phpunit laravel mockery laravel-5

我正在 Laravel 应用程序中测试端点。但是,我有一个中间件,它执行复杂的逻辑来确定用户的位置(使用 ip 反向查找等,例如以下代码:

public function getOpCityByIP()
{
    // Get the client's remote ip address
    if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR']) {
        $clientIpAddress = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])[0];
    } else {
       $clientIpAddress = $_SERVER['REMOTE_ADDR'];
    }
    $opCityArray = OpCityIP::get($clientIpAddress);
    return $opCityArray;
}
Run Code Online (Sandbox Code Playgroud)

我对深入所述中间件中此类方法的内部并不得不模拟它们等不感兴趣。我宁愿在单元测试期间简单地跳过整个中间件,或者至少模拟其整个操作,并将结果硬编码为预定的东西。我怎么做?

我正在使用 Laravel 5.4

更新

我需要它忽略特定的中间件,而不是全部

pat*_*cus 5

您可以使用withoutMiddleware()您可以在测试对象上从 Laravel 5.5 开始,此方法接受一个参数,让您指定要禁用的中间件,而不是仅仅禁用它们。

在你的测试中:

$this->withoutMiddleware([YourGeoIpMiddleware::class]);
Run Code Online (Sandbox Code Playgroud)