Тестирование поставщиков услуг Laravel

Я (мы) создаем пакет, который выступает в качестве основного компонента для нашей будущей CMS, и, конечно же, этот пакет нуждается в некоторых модульных тестах. Когда пакет регистрируется, первое, что он делает, это устанавливает внутренний/внешний контекст следующим образом:

class FoundationServiceProvider extends ServiceProvider
{
    // ... stuff ...

    public function register()
    {
        // Switch the context.
        // Url's containing '/admin' will get the backend context
        // all other urls will get the frontend context.
        $this->app['build.context'] = request()->segment(1) === 'admin'
                ? Context::BACKEND
                : Context::FRONTEND;
    }
}

Поэтому, когда я посещаю URL-адрес /admin, для переменной app('build.context') будет установлено значение backend, в противном случае для нее будет установлено значение `frontend.

Чтобы проверить это, я создал следующий тест:

class ServiceProviderTest extends \TestCase
{

    public function test_that_we_get_the_backend_context()
     {
        $this->visit('admin');
        $this->assertEquals(Context::BACKEND, app('build.context'));
    }
}

Когда я запускаю код в браузере (переход к /admin), контекст будет выбран, и вызов app('build.context') вернет backend, но при запуске этого теста я всегда получаю «интерфейс».

Я что-то не заметил или неправильный код при использовании phpunit?

заранее спасибо


person frietkot    schedule 06.06.2016    source источник


Ответы (1)


Ну тут непростая ситуация. Насколько я понимаю, laravel инициирует два экземпляра фреймворка при запуске тестов: один запускает тесты, а другой управляется с помощью инструкций. Вы можете увидеть это в файлеtests/TestCase.php.

Итак, в вашем случае вы манипулируете одним экземпляром, но проверяете контекст другого (того, который не посещал /admin и просто запускает тесты). Я не знаю, есть ли способ получить прямой доступ к управляемому экземпляру - в документации по этому вопросу нет ничего полезного.

Одним из обходных путей может быть создание маршрута только для целей тестирования, что-то вроде /admin/test_context, который будет выводить текущий контекст и проверять его с помощью

$this->visit('admin/test_context')->see(Context::BACKEND);

Не слишком элегантно, но должно сработать. В противном случае осмотритесь в laravel, возможно, вы найдете какую-то недокументированную функцию.

person Tadas Paplauskas    schedule 06.06.2016