Как позволить модульному тесту игнорировать промежуточное ПО в Laravel

Я тестирую конечную точку в своем приложении 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;
}

Я не заинтересован в том, чтобы вникать в внутренности таких методов в указанном промежуточном программном обеспечении и издеваться над ними и т. д. Я бы предпочел просто пропустить все промежуточное программное обеспечение во время модульного тестирования или, по крайней мере, издеваться над всеми его операциями и вместо этого жестко кодировать результат для нечто предопределенное. Как я могу это сделать?

Я использую Ларавель 5.4

Обновить

мне нужно, чтобы он игнорировал определенное промежуточное ПО, а не все из них


person abbood    schedule 07.08.2019    source источник
comment
в вашем модульном тесте вы можете отключить промежуточное ПО, используя disableMiddleware()   -  person xiarnousx    schedule 07.08.2019


Ответы (3)


Вы можете использовать метод withoutMiddleware() на своем тестовом объекте. Начиная с Laravel 5.5, этот метод принимает параметр, который позволяет указать, какое промежуточное ПО следует отключить, а не просто отключать их все.

В вашем тесте:

$this->withoutMiddleware([YourGeoIpMiddleware::class]);
person patricus    schedule 07.08.2019
comment
Я использую 5.4. Интересно, заслуживает ли это само по себе обновление до 5.5? - person abbood; 08.08.2019
comment
@abhood Ознакомьтесь с этим ответом. В нем есть информация о том, что делать, если вы еще не на 5.5+. После того, как я ответил здесь, я искал похожие вопросы в SO и нашел более старый, на который требовался обновленный ответ. Я написал там более полный ответ и отмечу этот вопрос как дубликат, если это решит вашу проблему. - person patricus; 08.08.2019

Чтобы решить мою проблему с пропуском определенного промежуточного ПО, я просто поместил этот код в метод handle указанного промежуточного ПО:

public function handle($request, Closure $next)
{
    if (config('app.env') === 'testing') {
        return $next($request);
    }
    ..
person abbood    schedule 08.08.2019

person    schedule
comment
мне нужно, чтобы он игнорировал промежуточное ПО конкретного, а не все - person abbood; 07.08.2019
comment
Важное отличие в этом обновлении. В этом случае вы должны использовать ответ патрика - person user6854465; 07.08.2019