{{TOC}} {{DOCVER 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51}} == Введение == Laravel предоставляет очень удобный API для создания HTTP-запросов к вашему приложению, проверки вывода, и даже заполнения форм. Например, посмотрим на приведённый тест: %% visit('/') ->see('Laravel 5') ->dontSee('Rails'); } } %% Метод %%visit()%% делает %%(t)GET%%-запрос в приложение. Метод %%see()%% объявляет, что мы должны увидеть данный текст в отклике приложения. Метод %%dontSee()%% объявляет, что данный текст не возвращается в отклике приложения. Это самый базовый тест приложения в Laravel. Вы можете использовать метод %%visitRoute()%%, чтобы выполнить GET-запрос через именованный маршрут: %% $this->visitRoute('profile'); $this->visitRoute('profile', ['user' => 1]); %% === Взаимодействие со ссылками === В этом тесте мы сделаем запрос в приложение, "нажмём" ссылку в возвращённом отклике, а затем проверим, что оказались на нужном URI. Например, предположим, что в нашем отклике есть ссылка с текстом "О нас": %%(html) О нас %% Теперь давайте напишем тест, нажимающий ссылку и проверяющий переход пользователя на правильную страницу: %% public function testBasicExample() { $this->visit('/') ->click('О нас') ->seePageIs('/about-us'); } %% Вы можете проверить, что пользователь достиг корректный именованный маршрут, методом %%seeRouteIs(): %% ->seeRouteIs('profile', ['user' => 1]); %% === Взаимодействие с формами === Также Laravel предоставляет несколько методов для тестирования форм. Методы %%type()%%, %%select()%%, %%check()%%, %%attach()%% и %%press()%% позволяют вам взаимодействовать со всеми элементами ввода на ваших формах. Например, представим, что на странице регистрации в приложении есть такая форма: %%(html)
{{ csrf_field() }}
Name:
Accept Terms
%% Мы можем написать тест для заполнения этой формы и проверки результата: %% public function testNewUserRegistration() { $this->visit('/register') ->type('Taylor', 'name') ->check('terms') ->press('Register') ->seePageIs('/dashboard'); } %% Если ваша форма содержит другие элементы ввода, такие как радио-кнопки и выпадающие списки, вы так же легко можете заполнить такие типы полей. Вот список всех методов для работы с формами: %%(hvlraw)
Метод Описание
$this->type($text, $elementName)Ввести текст в данное поле
$this->select($value, $elementName)Выбрать радио-кнопку или выпадающее поле
$this->check($elementName)Поставить чекбокс
$this->uncheck($elementName)Снять чекбокс
$this->attach($pathToFile, $elementName)Прикрепить файл к форме
$this->press($buttonTextOrElementName)Нажать кнопку с заданным текстом или именем
%% **Загрузка файлов** Если на вашей форме есть элементы ввода типа %%(t)file%%, вы можете прикрепить файлы к форме методом %%attach()%%: %% public function testPhotoCanBeUploaded() { $this->visit('/upload') ->attach($pathToFile, 'photo') ->press('Upload') ->see('Upload Successful!'); } %% === Тестирование JSON API === Также Laravel предоставляет несколько вспомогательных функций для тестирования JSON API и их откликов. Например, методы %%json()%%, %%get()%%, %%post()%%, %%put()%%, %%patch()%% и %%delete()%% используются для выполнения различных HTTP-запросов. Вы также легко можете передать данные и заголовки в эти методы. Для начала давайте напишем тест, выполняющий %%(t)POST%%-запрос к %%(t)/user%% и проверяющий, что возвращаются ожидаемые данные: %% json('POST', '/user', ['name' => 'Sally']) ->seeJson([ 'created' => true, ]); } } %% .(alert) Метод %%seeJson()%% конвертирует данный массив в JSON, а затем проверяет, что фрагмент JSON появляется **где-либо** внутри полного JSON-отклика, возвращаемого приложением. Поэтому, если в нём будут ещё и другие свойства, этот тест всё равно будет пройден успешно, так как данный фрагмент присутствует в отклике. === Проверка на точное совпадение === Если вы хотите проверить **точное** совпадение данного массива с возвращённым из приложения JSON, вам надо использовать метод %%seeJsonEquals()%%: %% json('POST', '/user', ['name' => 'Sally']) ->seeJsonEquals([ 'created' => true, ]); } } %% === Проверка на совпадение структуры === Также можно проверить соответствие структуры JSON определённым требованиям. В этом случае используйте метод %%seeJsonStructure()%% и передайте в него ожидаемую JSON-структуру: %% get('/user/1') ->seeJsonStructure([ 'name', 'pet' => [ 'name', 'age' ] ]); } } %% В этом примере ожидается получение атрибута %%(t)name%% и вложенного объекта %%(t)pet%% с его собственными атрибутами %%(t)name%% и %%(t)age%%. Метод %%seeJsonStructure()%% выполнится без ошибки, если в отклике будут дополнительные ключи. Например, проверка будет пройдена и в том случае, когда %%(t)pet%% будет иметь атрибут %%(t)weight%%. Вы можете использовать %%(t)*%%, чтобы задать требование, что возвращаемая структура JSON должна содержать список, в котором каждый элемент содержит по крайней мере те атрибуты, которые есть в наборе значений: %% get('/users') ->seeJsonStructure([ '*' => [ 'id', 'name', 'email' ] ]); } } %% Вы можете использовать вложение %%(t)*%%. Тогда мы потребуем, что каждый %%(t)user%% в JSON отклике должен содержать заданный набор атрибутов, и каждый %%(t)pet%% каждого %%(t)user%% также должен содержать заданный набор атрибутов: %% $this->get('/users') ->seeJsonStructure([ '*' => [ 'id', 'name', 'email', 'pets' => [ '*' => [ 'name', 'age' ] ] ] ]); %% === Сессии / Аутентификация === В Laravel есть несколько функций для работы с сессиями во время тестирования. Сначала вы можете задать данные сессии для данного массива при помощи метода %%withSession()%%. Это полезно для загрузки сессии с данными перед выполнением тестового запроса в приложение: %% withSession(['foo' => 'bar']) ->visit('/'); } } %% Конечно, чаще всего сессии используют для поддержания нужного состояния аутентифицированного пользователя. Простой способ аутентифицировать данного пользователя в качестве текущего - метод %%actingAs()%%. Например, мы можем использовать ((/docs/v5/database-testing#writing-factories фабрику модели)), чтобы сгенерировать и аутентифицировать пользователя: %% create(); $this->actingAs($user) ->withSession(['foo' => 'bar']) ->visit('/') ->see('Hello, '.$user->name); } } %% Вторым аргументом метода %%actingAs()%% вы можете указать защитника для аутентификации данного пользователя: %% $this->actingAs($user, 'api') %% === Отключение посредников === При тестировании приложения иногда удобно отключить ((/docs/v5/middleware посредников)) для некоторых тестов. Это позволит вам тестировать маршруты и контроллер изолированно от любых влияний посредников. Laravel содержит простой типаж %%(t)WithoutMiddleware%%, который можно использовать для автоматического отключения всех посредников для класса теста: %% withoutMiddleware(); $this->visit('/') ->see('Laravel 5'); } } %% === Свои HTTP-запросы === Если вы хотите сделать свой HTTP-запрос в приложение и получить полный объект %%(t)Illuminate\Http\Response%%, используйте метод %%call()%%: %% public function testApplication() { $response = $this->call('GET', '/'); $this->assertEquals(200, $response->status()); } %% Если вы делаете запросы %%(t)POST%%, %%(t)PUT%% или %%(t)PATCH %%, то можете передать массив входных данных вместе с запросом. Тогда эти данные будут доступны в ваших маршрутах и контроллере через ((/docs/v5/requests экземпляр запроса)): %% $response = $this->call('POST', '/user', ['name' => 'Taylor']); %% === Проверки PHPUnit (//assertions//) === Laravel предоставляет несколько //assert//-методов для тестов ((https://phpunit.de/ PHPUnit)): %%(hvlraw)
Метод Описание
->assertResponseOk();Проверка того, что клиентский отклик имеет статус ОК.
->assertResponseStatus($code);Проверка того, что клиентский отклик имеет указанный статус.
->assertViewHas($key, $value = null);Проверка того, что представление в отклике содержит данный кусок привязанных данных.
->assertViewHasAll(array $bindings);Проверка того, что представление содержит данный список привязанных данных.
->assertViewMissing($key);Проверка того, что в представлении в отклике отсутствует данный кусок привязанных данных.
->assertRedirectedTo($uri, $with = []);Проверка того, что клиент был переадресован по данному URI.
->assertRedirectedToRoute($name, $parameters = [], $with = []);Проверка того, что клиент был переадресован по данному маршруту
->assertRedirectedToAction($name, $parameters = [], $with = []);Проверка того, что клиент был переадресован к данному действию
->assertSessionHas($key, $value = null);Проверка того, что в сессии есть данное значение.
->assertSessionHasAll(array $bindings);Проверка того, что в сессии есть данный список значений.
->assertSessionHasErrors($bindings = [], $format = null);Проверка того, что в сессии есть привязанные ошибки.
->assertHasOldInput();Проверка того, что в сессии есть введённые ранее данные.
->assertSessionMissing($key);Проверка того, что в сессии нет указанного ключа.
%%