Тестирование возможностей HTTP
Тестирование возможностей позволяет просмотреть результаты одного вызова вашего приложения. Это может быть возвращение результатов одной веб-формы, обращение к точке входа API и многое другое. Это удобно, потому что позволяет протестировать весь жизненный цикл одного запроса, гарантируя, что маршрутизация работает, что ответ имеет правильный формат, анализировать результаты и многое другое.
Класс теста
Для тестирования возможностей необходимо, чтобы все ваши классы тестов использовали атрибуты CodeIgniter\Test\DatabaseTestTrait и CodeIgniter\Test\FeatureTestTrait. Поскольку эти инструменты тестирования полагаются на надлежащую подготовку базы данных, вы всегда должны убеждаться, что вызываются parent::setUp() и parent::tearDown(), если вы реализуете свои собственные методы.
<?php
namespace App;
use CodeIgniter\Test\DatabaseTestTrait;
use CodeIgniter\Test\FeatureTestTrait;
class TestFoo extends CIUnitTestCase
{
use DatabaseTestTrait, FeatureTestTrait;
protected function setUp(): void
{
parent::setUp();
$this->myClassMethod();
}
protected function tearDown(): void
{
parent::tearDown();
$this->anotherClassMethod();
}
}
Запрос страницы
По сути, тесты возможностей просто позволяют вам вызвать точку входа вашего приложения и получить результаты обратно. Для этого вы используете метод call(). Первый параметр — HTTP-метод, который нужно использовать (чаще всего GET или POST). Второй параметр — путь на вашем сайте для тестирования. Третий параметр принимает массив, который используется для заполнения суперглобальных переменных для используемого HTTP-глагола. Таким образом, для метода GET будет заполняться переменная $_GET, а для запроса POST — массив $_POST.
// Get a simple page
$result = $this->call('get', '/');
// Submit a form
$result = $this->call('post', 'contact'), [
'name' => 'Fred Flintstone',
'email' => 'flintyfred@example.com'
]);
Для каждого HTTP-глагола существуют сокращенные методы, чтобы упростить ввод и сделать вещи более понятными:
$this->get($path, $params); $this->post($path, $params); $this->put($path, $params); $this->patch($path, $params); $this->delete($path, $params); $this->options($path, $params);
Примечание
Массив $params не имеет смысла для каждого HTTP-глагола, но включен для согласованности.
Настройка различных маршрутов
Вы можете использовать пользовательский набор маршрутов, передав массив «маршрутов» в метод withRoutes(). Это переопределит любые существующие маршруты в системе:
$routes = [
['get', 'users', 'UserController::list'],
];
$result = $this->withRoutes($routes)->get('users');
Каждый из «маршрутов» представляет собой массив из 3 элементов, содержащий HTTP-глагол (или «add» для всех), URI для сопоставления и пункт назначения маршрутизации.
Настройка значений сессии
Вы можете установить пользовательские значения сессии для использования во время одного теста с помощью метода withSession(). Это принимает массив пар ключ/значение, которые должны существовать в переменной $_SESSION при выполнении этого запроса, или null` to indicate
that the current values of ``$_SESSION. Это полезно для тестирования аутентификации и т. д.
$values = [
'logged_in' => 123,
];
$result = $this->withSession($values)->get('admin');
// Or...
$_SESSION['logged_in'] = 123;
$result = $this->withSession()->get('admin');
Настройка заголовков
Вы можете установить значения заголовков с помощью метода withHeaders(). Это принимает массив пар ключ/значение, которые будут переданы как заголовок в вызов:
$headers = [
'CONTENT_TYPE' => 'application/json',
];
$result = $this->withHeaders($headers)->post('users');
Пропуск событий
События полезны для использования в вашем приложении, но могут быть проблематичными во время тестирования. Особенно события, используемые для отправки электронных писем. Вы можете сказать системе пропустить обработку любого события с помощью метода skipEvents():
$result = $this->skipEvents()->post('users', $userInfo);
Форматирование запроса
Вы можете установить формат тела вашего запроса, используя метод withBodyFormat(). В настоящее время он поддерживает либо json , либо xml . Это примет параметры, переданные в call(), post(), get()..., и назначит их телу запроса в заданном формате. Это также установит заголовок Content-Type для вашего запроса соответственно. Это полезно при тестировании API JSON или XML, так как вы можете задать запрос в виде, ожидаемом контроллером.
// If your feature test contains this:
$result = $this->withBodyFormat('json')->post('users', $userInfo);
// Your controller can then get the parameters passed in with:
$userInfo = $this->request->getJson();
Установка тела
Вы можете установить тело вашего запроса с помощью метода withBody(). Это позволяет вам форматировать тело так, как вам нужно. Рекомендуется использовать его, если у вас есть более сложные XML для тестирования. Также он не установит для вас заголовок Content-Type, поэтому, если вам он нужен, вы можете установить его с помощью метода withHeaders().
Проверка ответа
FeatureTestTrait::call() возвращает экземпляр TestResponse. См. Тестирование ответов, как использовать этот класс для выполнения дополнительных утверждений и проверок в ваших тестовых случаях.
© 2014–2020 British Columbia Institute of Technology
Licensed under the MIT License.
https://codeigniter.com/user_guide/testing/feature.html