Временно отключить/обойти промежуточное ПО

В своем приложении я реализовал сервер OAuth2 (oauth2-server-laravel) в сочетании с пользовательским пакетом аутентификации ( Sentinel от Cartalyst).

В моих маршрутах.php:

Route::group(['before' => 'oauth'], function()
{
    // ... some routes here
}

Таким образом, запрос должен предоставить заголовок авторизации, иначе приложение завершает работу с OAuthException.

Теперь я хочу протестировать свои контроллеры. Поэтому мне нужно заполнить мою базу данных сеансом OAuth и токеном доступа для каждого теста. Затем перезапишите call()-метод TestCase и установите заголовок HTTP-авторизации с токеном носителя.

Есть ли способ отключить или обойти промежуточное ПО (в моем случае только для модульного тестирования)?

В Laravel 4 они назывались фильтрами маршрутов и в любом случае были отключены в тестовой среде. Вы также можете вручную включить/отключить их с помощью Route::enableFilters().


person nahri    schedule 31.03.2015    source источник
comment
Я также хотел бы знать ответ на этот вопрос, пока я читал, что невозможно отключить промежуточное программное обеспечение в Laravel 5 так, как фильтры маршрутов были отключены в тестовом режиме в Laravel 4. Однако я очень хочу быть доказанным неправым.   -  person delatbabel    schedule 07.04.2015


Ответы (3)


Судя по всему, с выпуском Laravel 5.1 вчера в класс TestCase был добавлен метод disableMiddleware(), который теперь делает именно то, что я хотел.

Проблема решена. :)

person nahri    schedule 10.06.2015
comment
Так что просто поместите use WithoutMiddleware; в свой тестовый класс. - person stephen; 18.12.2015
comment
Улучшение этого было объединено с фреймворком, который позволяет отключать определенный набор промежуточных программ. см. github.com/laravel/framework/pull/18673 - person meysam; 28.04.2017

Единственный ответ, который я смог придумать, — поставить обход в самом промежуточном программном обеспечении. Например:

public function handle($request, Closure $next)
{
    // Don't validate authentication when testing.
    if (env('APP_ENV') === 'testing') {
        return $next($request);
    }
    // ... continue on to process the request
}

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

person delatbabel    schedule 07.04.2015

Вот пакет, над которым я работал после той же проблемы.

https://github.com/moon0326/FakeMiddleware

person Moon    schedule 16.04.2015