{{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)
Метод |
Описание |
$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); | Проверка того, что в сессии нет указанного ключа. |
%%