- Введение
- Выполнение запросов
- Тестирование JSON API
- Тестирование загрузки файлов
- Тестирование представлений
- Доступные утверждения
#Введение
Laravel предоставляет очень удобный API для выполнения HTTP-запросов к вашему приложению и проверки ответов. Например, посмотрите на определённый ниже функциональный тест:
<?php
namespace Tests\Feature;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* Пример базового теста.
*/
public function test_the_application_returns_a_successful_response(): void
{
$response = $this->get('/');
$response->assertStatus(200);
}
}
Метод get выполняет GET-запрос к приложению, а метод assertStatus проверяет, что возвращённый ответ имеет указанный HTTP-статус. Помимо этого простого утверждения, Laravel содержит множество других утверждений для проверки заголовков ответа, содержимого, структуры JSON и прочего.
#Выполнение запросов
Для выполнения запроса к вашему приложению вы можете вызвать методы get, post, put, patch или delete в вашем тесте. Эти методы не выполняют «реальный» HTTP-запрос к приложению. Вместо этого весь сетевой запрос симулируется внутри.
Вместо возвращения экземпляра Illuminate\Http\Response, методы тестовых запросов возвращают экземпляр Illuminate\Testing\TestResponse, который предоставляет множество полезных утверждений для проверки ответов вашего приложения:
<?php
namespace Tests\Feature;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* Пример базового теста.
*/
public function test_a_basic_request(): void
{
$response = $this->get('/');
$response->assertStatus(200);
}
}
В общем случае каждый ваш тест должен выполнять только один запрос к приложению. Неожиданное поведение может возникнуть, если в одном методе теста выполняется несколько запросов.
Для удобства CSRF middleware автоматически отключается при выполнении тестов.
#Настройка заголовков запроса
Вы можете использовать метод withHeaders для настройки заголовков запроса перед отправкой в приложение. Этот метод позволяет добавить любые пользовательские заголовки к запросу:
<?php
namespace Tests\Feature;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* Пример базового функционального теста.
*/
public function test_interacting_with_headers(): void
{
$response = $this->withHeaders([
'X-Header' => 'Value',
])->post('/user', ['name' => 'Sally']);
$response->assertStatus(201);
}
}
#Cookies
Вы можете использовать методы withCookie или withCookies для установки значений cookies перед выполнением запроса. Метод withCookie принимает имя и значение cookie в качестве двух аргументов, а withCookies — массив пар имя/значение:
<?php
namespace Tests\Feature;
use Tests\TestCase;
class ExampleTest extends TestCase
{
public function test_interacting_with_cookies(): void
{
$response = $this->withCookie('color', 'blue')->get('/');
$response = $this->withCookies([
'color' => 'blue',
'name' => 'Taylor',
])->get('/');
}
}
#Сессия / Аутентификация
Laravel предоставляет несколько помощников для работы с сессией во время HTTP-тестирования. Во-первых, вы можете установить данные сессии в виде массива с помощью метода withSession. Это полезно для загрузки данных в сессию перед выполнением запроса к приложению:
<?php
namespace Tests\Feature;
use Tests\TestCase;
class ExampleTest extends TestCase
{
public function test_interacting_with_the_session(): void
{
$response = $this->withSession(['banned' => false])->get('/');
}
}
Сессия Laravel обычно используется для хранения состояния текущего аутентифицированного пользователя. Поэтому метод-помощник actingAs предоставляет простой способ аутентифицировать заданного пользователя как текущего. Например, можно использовать model factory для создания и аутентификации пользователя:
<?php
namespace Tests\Feature;
use App\Models\User;
use Tests\TestCase;
class ExampleTest extends TestCase
{
public function test_an_action_that_requires_authentication(): void
{
$user = User::factory()->create();
$response = $this->actingAs($user)
->withSession(['banned' => false])
->get('/');
}
}
Вы также можете указать, какой guard должен использоваться для аутентификации данного пользователя, передав имя guard в качестве второго аргумента методу actingAs. Guard, переданный в actingAs, станет guard по умолчанию на время выполнения теста:
$this->actingAs($user, 'web')
#Отладка ответов
После выполнения тестового запроса к вашему приложению вы можете использовать методы dump, dumpHeaders и dumpSession для просмотра и отладки содержимого ответа:
<?php
namespace Tests\Feature;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* Пример базового теста.
*/
public function test_basic_test(): void
{
$response = $this->get('/');
$response->dumpHeaders();
$response->dumpSession();
$response->dump();
}
}
В качестве альтернативы вы можете использовать методы dd, ddHeaders и ddSession для вывода информации об ответе с последующей остановкой выполнения:
<?php
namespace Tests\Feature;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* Пример базового теста.
*/
public function test_basic_test(): void
{
$response = $this->get('/');
$response->ddHeaders();
$response->ddSession();
$response->dd();
}
}
#Обработка исключений
Иногда может потребоваться проверить, что ваше приложение выбрасывает определённое исключение. Чтобы исключение не было перехвачено обработчиком исключений Laravel и не возвращалось как HTTP-ответ, вы можете вызвать метод withoutExceptionHandling перед выполнением запроса:
$response = $this->withoutExceptionHandling()->get('/');
Кроме того, если вы хотите убедиться, что ваше приложение не использует устаревшие функции PHP или библиотек, вы можете вызвать метод withoutDeprecationHandling перед выполнением запроса. При отключённой обработке устареваний предупреждения будут преобразованы в исключения, что приведёт к провалу теста:
$response = $this->withoutDeprecationHandling()->get('/');
Метод assertThrows можно использовать для проверки, что код внутри переданного замыкания выбрасывает исключение указанного типа:
$this->assertThrows(
fn () => (new ProcessOrder)->execute(),
OrderInvalid::class
);
#Тестирование JSON API
Laravel также предоставляет несколько помощников для тестирования JSON API и их ответов. Например, методы json, getJson, postJson, putJson, patchJson, deleteJson и optionsJson могут использоваться для выполнения JSON-запросов с разными HTTP-методами. Вы также можете легко передавать данные и заголовки этим методам. Для начала напишем тест, который выполнит POST-запрос к /api/user и проверит, что возвращён ожидаемый JSON:
<?php
namespace Tests\Feature;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* Пример базового функционального теста.
*/
public function test_making_an_api_request(): void
{
$response = $this->postJson('/api/user', ['name' => 'Sally']);
$response
->assertStatus(201)
->assertJson([
'created' => true,
]);
}
}
Кроме того, данные JSON-ответа могут быть доступны как элементы массива в ответе, что удобно для проверки отдельных значений, возвращённых в JSON:
$this->assertTrue($response['created']);
Метод assertJson преобразует ответ в массив и использует PHPUnit::assertArraySubset для проверки, что указанный массив присутствует в JSON-ответе, возвращённом приложением. Поэтому, если в JSON-ответе есть другие свойства, тест всё равно пройдёт, если данный фрагмент присутствует.
#Проверка точного совпадения JSON
Как уже упоминалось, метод assertJson проверяет наличие фрагмента JSON в ответе. Если вы хотите убедиться, что данный массив точно совпадает с JSON, возвращённым вашим приложением, используйте метод assertExactJson:
<?php
namespace Tests\Feature;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* Пример базового функционального теста.
*/
public function test_asserting_an_exact_json_match(): void
{
$response = $this->postJson('/user', ['name' => 'Sally']);
$response
->assertStatus(201)
->assertExactJson([
'created' => true,
]);
}
}
#Проверка по JSON-путям
Если вы хотите проверить, что JSON-ответ содержит указанные данные по заданному пути, используйте метод assertJsonPath:
<?php
namespace Tests\Feature;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* Пример базового функционального теста.
*/
public function test_asserting_a_json_paths_value(): void
{
$response = $this->postJson('/user', ['name' => 'Sally']);
$response
->assertStatus(201)
->assertJsonPath('team.owner.name', 'Darian');
}
}
Метод assertJsonPath также принимает замыкание, которое можно использовать для динамической проверки, должна ли пройти проверка:
$response->assertJsonPath('team.owner.name', fn (string $name) => strlen($name) >= 3);
#Флюентное тестирование JSON
Laravel также предлагает удобный способ флюентного тестирования JSON-ответов вашего приложения. Для начала передайте замыкание методу assertJson. Это замыкание будет вызвано с экземпляром Illuminate\Testing\Fluent\AssertableJson, который можно использовать для утверждений по возвращённому JSON. Метод where позволяет делать утверждения по конкретному атрибуту JSON, а метод missing — проверять отсутствие атрибута:
use Illuminate\Testing\Fluent\AssertableJson;
/**
* Пример базового функционального теста.
*/
public function test_fluent_json(): void
{
$response = $this->getJson('/users/1');
$response
->assertJson(fn (AssertableJson $json) =>
$json->where('id', 1)
->where('name', 'Victoria Faith')
->where('email', fn (string $email) => str($email)->is('victoria@gmail.com'))
->whereNot('status', 'pending')
->missing('password')
->etc()
);
}
#Понимание метода etc
В приведённом примере вы могли заметить вызов метода etc в конце цепочки утверждений. Этот метод сообщает Laravel, что в JSON-объекте могут присутствовать и другие атрибуты. Если метод etc не используется, тест провалится, если в JSON-объекте есть атрибуты, по которым не было сделано утверждений.
Цель такого поведения — защитить вас от случайного раскрытия чувствительной информации в JSON-ответах, заставляя либо явно делать утверждение по атрибуту, либо явно разрешать дополнительные атрибуты через метод etc.
Однако учтите, что отсутствие метода etc в вашей цепочке утверждений не гарантирует, что дополнительные атрибуты не добавляются в массивы, вложенные в ваш JSON-объект. Метод etc гарантирует только, что дополнительных атрибутов нет на том уровне вложенности, в котором был вызван etc.
#Проверка наличия / отсутствия атрибутов
Для проверки наличия или отсутствия атрибута используйте методы has и missing:
$response->assertJson(fn (AssertableJson $json) =>
$json->has('data')
->missing('message')
);
Кроме того, методы hasAll и missingAll позволяют одновременно проверять наличие или отсутствие нескольких атрибутов:
$response->assertJson(fn (AssertableJson $json) =>
$json->hasAll(['status', 'data'])
->missingAll(['message', 'code'])
);
Вы можете использовать метод hasAny, чтобы проверить, что хотя бы один из указанных атрибутов присутствует:
$response->assertJson(fn (AssertableJson $json) =>
$json->has('status')
->hasAny('data', 'message', 'code')
);
#Проверка JSON-коллекций
Часто ваш маршрут возвращает JSON-ответ, содержащий несколько элементов, например, несколько пользователей:
Route::get('/users', function () {
return User::all();
});
В таких случаях можно использовать метод has объекта fluent JSON для проверки пользователей в ответе. Например, проверим, что JSON-ответ содержит трёх пользователей. Затем сделаем утверждения по первому пользователю в коллекции с помощью метода first. Метод first принимает замыкание, которое получает другой объект AssertableJson для проверки первого объекта в JSON-коллекции:
$response
->assertJson(fn (AssertableJson $json) =>
$json->has(3)
->first(fn (AssertableJson $json) =>
$json->where('id', 1)
->where('name', 'Victoria Faith')
->where('email', fn (string $email) => str($email)->is('victoria@gmail.com'))
->missing('password')
->etc()
)
);
#Ограничение области утверждений для JSON-коллекций
Иногда маршруты вашего приложения возвращают JSON-коллекции с именованными ключами:
Route::get('/users', function () {
return [
'meta' => [...],
'users' => User::all(),
];
})
При тестировании таких маршрутов вы можете использовать метод has для проверки количества элементов в коллекции. Кроме того, метод has можно использовать для ограничения области цепочки утверждений:
$response
->assertJson(fn (AssertableJson $json) =>
$json->has('meta')
->has('users', 3)
->has('users.0', fn (AssertableJson $json) =>
$json->where('id', 1)
->where('name', 'Victoria Faith')
->where('email', fn (string $email) => str($email)->is('victoria@gmail.com'))
->missing('password')
->etc()
)
);
Однако вместо двух отдельных вызовов метода has для проверки коллекции users вы можете сделать один вызов с передачей замыкания в качестве третьего параметра. В этом случае замыкание будет автоматически вызвано и ограничено первым элементом коллекции:
$response
->assertJson(fn (AssertableJson $json) =>
$json->has('meta')
->has('users', 3, fn (AssertableJson $json) =>
$json->where('id', 1)
->where('name', 'Victoria Faith')
->where('email', fn (string $email) => str($email)->is('victoria@gmail.com'))
->missing('password')
->etc()
)
);
#Проверка типов JSON
Возможно, вы захотите проверить, что свойства в JSON-ответе имеют определённый тип. Класс Illuminate\Testing\Fluent\AssertableJson предоставляет методы whereType и whereAllType для этой цели:
$response->assertJson(fn (AssertableJson $json) =>
$json->whereType('id', 'integer')
->whereAllType([
'users.0.name' => 'string',
'meta' => 'array'
])
);
Вы можете указать несколько типов через символ | или передать массив типов вторым параметром методу whereType. Утверждение будет успешным, если значение ответа соответствует любому из указанных типов:
$response->assertJson(fn (AssertableJson $json) =>
$json->whereType('name', 'string|null')
->whereType('id', ['string', 'integer'])
);
Методы whereType и whereAllType распознают следующие типы: string, integer, double, boolean, array и null.
#Тестирование загрузки файлов
Класс Illuminate\Http\UploadedFile предоставляет метод fake, который можно использовать для генерации фиктивных файлов или изображений для тестирования. В сочетании с методом fake фасада Storage это значительно упрощает тестирование загрузки файлов. Например, вы можете использовать эти возможности для тестирования формы загрузки аватара:
<?php
namespace Tests\Feature;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Tests\TestCase;
class ExampleTest extends TestCase
{
public function test_avatars_can_be_uploaded(): void
{
Storage::fake('avatars');
$file = UploadedFile::fake()->image('avatar.jpg');
$response = $this->post('/avatar', [
'avatar' => $file,
]);
Storage::disk('avatars')->assertExists($file->hashName());
}
}
Если вы хотите проверить, что файл отсутствует, используйте метод assertMissing фасада Storage:
Storage::fake('avatars');
// ...
Storage::disk('avatars')->assertMissing('missing.jpg');
#Настройка фиктивных файлов
При создании файлов с помощью метода fake класса UploadedFile вы можете указать ширину, высоту и размер изображения (в килобайтах) для более точного тестирования правил валидации вашего приложения:
UploadedFile::fake()->image('avatar.jpg', $width, $height)->size(100);
Кроме создания изображений, вы можете создавать файлы любого другого типа с помощью метода create:
UploadedFile::fake()->create('document.pdf', $sizeInKilobytes);
При необходимости вы можете передать аргумент $mimeType в метод, чтобы явно указать MIME-тип файла:
UploadedFile::fake()->create(
'document.pdf', $sizeInKilobytes, 'application/pdf'
);
#Тестирование представлений
Laravel также позволяет рендерить представление без выполнения симулированного HTTP-запроса к приложению. Для этого вы можете вызвать метод view в вашем тесте. Метод view принимает имя представления и необязательный массив данных. Он возвращает экземпляр Illuminate\Testing\TestView, который предоставляет несколько методов для удобного утверждения содержимого представления:
<?php
namespace Tests\Feature;
use Tests\TestCase;
class ExampleTest extends TestCase
{
public function test_a_welcome_view_can_be_rendered(): void
{
$view = $this->view('welcome', ['name' => 'Taylor']);
$view->assertSee('Taylor');
}
}
Класс TestView предоставляет следующие методы утверждений: assertSee, assertSeeInOrder, assertSeeText, assertSeeTextInOrder, assertDontSee и assertDontSeeText.
При необходимости вы можете получить необработанное, отрендеренное содержимое представления, приведя экземпляр TestView к строке:
$contents = (string) $this->view('welcome');
#Совместное использование ошибок
Некоторые представления могут зависеть от ошибок, доступных в глобальном наборе ошибок, предоставляемом Laravel. Чтобы заполнить набор ошибок сообщениями, используйте метод withViewErrors:
$view = $this->withViewErrors([
'name' => ['Пожалуйста, укажите корректное имя.']
])->view('form');
$view->assertSee('Пожалуйста, укажите корректное имя.');
#Рендеринг Blade и компонентов
При необходимости вы можете использовать метод blade для оценки и рендеринга сырой строки Blade. Как и метод view, метод blade возвращает экземпляр Illuminate\Testing\TestView:
$view = $this->blade(
'<x-component :name="$name" />',
['name' => 'Taylor']
);
$view->assertSee('Taylor');
Вы можете использовать метод component для оценки и рендеринга Blade-компонента. Метод component возвращает экземпляр Illuminate\Testing\TestComponent:
$view = $this->component(Profile::class, ['name' => 'Taylor']);
$view->assertSee('Taylor');
#Доступные утверждения
#Утверждения для ответов
Класс Illuminate\Testing\TestResponse Laravel предоставляет множество пользовательских методов утверждений, которые вы можете использовать при тестировании вашего приложения. Эти утверждения доступны на ответе, возвращаемом методами тестирования json, get, post, put и delete:
assertAccepted assertBadRequest assertConflict assertCookie assertCookieExpired assertCookieNotExpired assertCookieMissing assertCreated assertDontSee assertDontSeeText assertDownload assertExactJson assertForbidden assertFound assertGone assertHeader assertHeaderMissing assertInternalServerError assertJson assertJsonCount assertJsonFragment assertJsonIsArray assertJsonIsObject assertJsonMissing assertJsonMissingExact assertJsonMissingValidationErrors assertJsonPath assertJsonMissingPath assertJsonStructure assertJsonValidationErrors assertJsonValidationErrorFor assertLocation assertMethodNotAllowed assertMovedPermanently assertContent assertNoContent assertStreamedContent assertNotFound assertOk assertPaymentRequired assertPlainCookie assertRedirect assertRedirectContains assertRedirectToRoute assertRedirectToSignedRoute assertRequestTimeout assertSee assertSeeInOrder assertSeeText assertSeeTextInOrder assertServerError assertServiceUnavailable assertSessionHas assertSessionHasInput assertSessionHasAll assertSessionHasErrors assertSessionHasErrorsIn assertSessionHasNoErrors assertSessionDoesntHaveErrors assertSessionMissing assertStatus assertSuccessful assertTooManyRequests assertUnauthorized assertUnprocessable assertUnsupportedMediaType assertValid assertInvalid assertViewHas assertViewHasAll assertViewIs assertViewMissing
#assertBadRequest
Проверяет, что ответ имеет HTTP статус код "плохой запрос" (400):
$response->assertBadRequest();
#assertAccepted
Проверяет, что ответ имеет HTTP статус код "принято" (202):
$response->assertAccepted();
#assertConflict
Проверяет, что ответ имеет HTTP статус код "конфликт" (409):
$response->assertConflict();
#assertCookie
Проверяет, что ответ содержит указанный cookie:
$response->assertCookie($cookieName, $value = null);
#assertCookieExpired
Проверяет, что ответ содержит указанный cookie и он истёк:
$response->assertCookieExpired($cookieName);
#assertCookieNotExpired
Проверяет, что ответ содержит указанный cookie и он не истёк:
$response->assertCookieNotExpired($cookieName);
#assertCookieMissing
Проверяет, что ответ не содержит указанный cookie:
$response->assertCookieMissing($cookieName);
#assertCreated
Проверяет, что ответ имеет HTTP статус код 201:
$response->assertCreated();
#assertDontSee
Проверяет, что указанная строка отсутствует в ответе приложения. Эта проверка автоматически экранирует строку, если не передать второй аргумент false:
$response->assertDontSee($value, $escaped = true);
#assertDontSeeText
Проверяет, что указанная строка отсутствует в тексте ответа. Эта проверка автоматически экранирует строку, если не передать второй аргумент false. Перед проверкой содержимое ответа пропускается через функцию PHP strip_tags:
$response->assertDontSeeText($value, $escaped = true);
#assertDownload
Проверяет, что ответ является "загрузкой". Обычно это означает, что маршрут вернул ответ Response::download, BinaryFileResponse или Storage::download:
$response->assertDownload();
Если нужно, можно проверить, что загружаемому файлу присвоено указанное имя:
$response->assertDownload('image.jpg');
#assertExactJson
Проверяет, что ответ содержит точное совпадение с указанными JSON-данными:
$response->assertExactJson(array $data);
#assertForbidden
Проверяет, что ответ имеет HTTP статус код "запрещено" (403):
$response->assertForbidden();
#assertFound
Проверяет, что ответ имеет HTTP статус код "найдено" (302):
$response->assertFound();
#assertGone
Проверяет, что ответ имеет HTTP статус код "удалено" (410):
$response->assertGone();
#assertHeader
Проверяет, что в ответе присутствует указанный заголовок с заданным значением:
$response->assertHeader($headerName, $value = null);
#assertHeaderMissing
Проверяет, что указанный заголовок отсутствует в ответе:
$response->assertHeaderMissing($headerName);
#assertInternalServerError
Проверяет, что ответ имеет HTTP статус код "внутренняя ошибка сервера" (500):
$response->assertInternalServerError();
#assertJson
Проверяет, что ответ содержит указанные JSON-данные:
$response->assertJson(array $data, $strict = false);
Метод assertJson преобразует ответ в массив и использует PHPUnit::assertArraySubset для проверки, что указанный массив присутствует в JSON-ответе приложения. Таким образом, если в JSON есть другие свойства, тест всё равно пройдет, если заданный фрагмент присутствует.
#assertJsonCount
Проверяет, что в JSON-ответе по указанному ключу находится массив с ожидаемым количеством элементов:
$response->assertJsonCount($count, $key = null);
#assertJsonFragment
Проверяет, что ответ содержит указанные JSON-данные где-либо в ответе:
Route::get('/users', function () {
return [
'users' => [
[
'name' => 'Taylor Otwell',
],
],
];
});
$response->assertJsonFragment(['name' => 'Taylor Otwell']);
#assertJsonIsArray
Проверяет, что JSON-ответ является массивом:
$response->assertJsonIsArray();
#assertJsonIsObject
Проверяет, что JSON-ответ является объектом:
$response->assertJsonIsObject();
#assertJsonMissing
Проверяет, что ответ не содержит указанные JSON-данные:
$response->assertJsonMissing(array $data);
#assertJsonMissingExact
Проверяет, что ответ не содержит точное совпадение с указанными JSON-данными:
$response->assertJsonMissingExact(array $data);
#assertJsonMissingValidationErrors
Проверяет, что в ответе отсутствуют JSON ошибки валидации для указанных ключей:
$response->assertJsonMissingValidationErrors($keys);
Более общий метод assertValid можно использовать для проверки, что в ответе нет ошибок валидации, возвращённых в JSON, и что ошибки не были сохранены в сессии.
#assertJsonPath
Проверяет, что ответ содержит указанные данные по заданному пути:
$response->assertJsonPath($path, $expectedValue);
Например, если ваше приложение возвращает следующий JSON-ответ:
{
"user": {
"name": "Steve Schoger"
}
}
Вы можете проверить, что свойство name объекта user соответствует заданному значению следующим образом:
$response->assertJsonPath('user.name', 'Steve Schoger');
#assertJsonMissingPath
Проверяет, что ответ не содержит указанный путь:
$response->assertJsonMissingPath($path);
Например, если ваше приложение возвращает следующий JSON-ответ:
{
"user": {
"name": "Steve Schoger"
}
}
Вы можете проверить, что он не содержит свойство email объекта user:
$response->assertJsonMissingPath('user.email');
#assertJsonStructure
Проверяет, что ответ имеет заданную JSON-структуру:
$response->assertJsonStructure(array $structure);
Например, если JSON-ответ вашего приложения содержит следующие данные:
{
"user": {
"name": "Steve Schoger"
}
}
Вы можете проверить, что структура JSON соответствует вашим ожиданиям следующим образом:
$response->assertJsonStructure([
'user' => [
'name',
]
]);
Иногда JSON-ответы вашего приложения могут содержать массивы объектов:
{
"user": [
{
"name": "Steve Schoger",
"age": 55,
"location": "Earth"
},
{
"name": "Mary Schoger",
"age": 60,
"location": "Earth"
}
]
}
В этом случае можно использовать символ * для проверки структуры всех объектов в массиве:
$response->assertJsonStructure([
'user' => [
'*' => [
'name',
'age',
'location'
]
]
]);
#assertJsonValidationErrors
Проверяет, что ответ содержит указанные JSON ошибки валидации для заданных ключей. Этот метод следует использовать при проверке ответов, где ошибки валидации возвращаются в виде JSON-структуры, а не сохраняются в сессии:
$response->assertJsonValidationErrors(array $data, $responseKey = 'errors');
Более общий метод assertInvalid можно использовать для проверки, что ответ содержит ошибки валидации, возвращённые в JSON, или что ошибки были сохранены в сессии.
#assertJsonValidationErrorFor
Проверяет, что ответ содержит любую JSON ошибку валидации для указанного ключа:
$response->assertJsonValidationErrorFor(string $key, $responseKey = 'errors');
#assertMethodNotAllowed
Проверяет, что ответ имеет HTTP статус код "метод не разрешён" (405):
$response->assertMethodNotAllowed();
#assertMovedPermanently
Проверяет, что ответ имеет HTTP статус код "перемещено навсегда" (301):
$response->assertMovedPermanently();
#assertLocation
Проверяет, что в заголовке Location ответа содержится указанное URI:
$response->assertLocation($uri);
#assertContent
Проверяет, что указанная строка совпадает с содержимым ответа:
$response->assertContent($value);
#assertNoContent
Проверяет, что ответ имеет указанный HTTP статус код и не содержит содержимого:
$response->assertNoContent($status = 204);
#assertStreamedContent
Проверяет, что указанная строка совпадает с потоковым содержимым ответа:
$response->assertStreamedContent($value);
#assertNotFound
Проверяет, что ответ имеет HTTP статус код "не найдено" (404):
$response->assertNotFound();
#assertOk
Проверяет, что ответ имеет HTTP статус код 200:
$response->assertOk();
#assertPaymentRequired
Проверяет, что ответ имеет HTTP статус код "требуется оплата" (402):
$response->assertPaymentRequired();
#assertPlainCookie
Проверяет, что ответ содержит указанный незашифрованный cookie:
$response->assertPlainCookie($cookieName, $value = null);
#assertRedirect
Проверяет, что ответ является редиректом на указанный URI:
$response->assertRedirect($uri = null);
#assertRedirectContains
Проверяет, что ответ перенаправляет на URI, содержащий указанную строку:
$response->assertRedirectContains($string);
#assertRedirectToRoute
Проверяет, что ответ является редиректом на указанный именованный маршрут:
$response->assertRedirectToRoute($name, $parameters = []);
#assertRedirectToSignedRoute
Проверяет, что ответ является редиректом на указанный подписанный маршрут:
$response->assertRedirectToSignedRoute($name = null, $parameters = []);
#assertRequestTimeout
Проверяет, что ответ имеет HTTP статус код "время ожидания запроса истекло" (408):
$response->assertRequestTimeout();
#assertSee
Проверяет, что указанная строка содержится в ответе. Эта проверка автоматически экранирует строку, если не передать второй аргумент false:
$response->assertSee($value, $escaped = true);
#assertSeeInOrder
Проверяет, что указанные строки содержатся в ответе в заданном порядке. Эта проверка автоматически экранирует строки, если не передать второй аргумент false:
$response->assertSeeInOrder(array $values, $escaped = true);
#assertSeeText
Проверяет, что указанная строка содержится в тексте ответа. Эта проверка автоматически экранирует строку, если не передать второй аргумент false. Содержимое ответа перед проверкой пропускается через функцию PHP strip_tags:
$response->assertSeeText($value, $escaped = true);
#assertSeeTextInOrder
Проверяет, что указанные строки содержатся в тексте ответа в заданном порядке. Эта проверка автоматически экранирует строки, если не передать второй аргумент false. Содержимое ответа перед проверкой пропускается через функцию PHP strip_tags:
$response->assertSeeTextInOrder(array $values, $escaped = true);
#assertServerError
Проверяет, что ответ имеет HTTP статус код ошибки сервера (>= 500 и < 600):
$response->assertServerError();
#assertServiceUnavailable
Проверяет, что ответ имеет HTTP статус код "служба недоступна" (503):
$response->assertServiceUnavailable();
#assertSessionHas
Проверяет, что сессия содержит указанные данные:
$response->assertSessionHas($key, $value = null);
При необходимости в качестве второго аргумента методу assertSessionHas можно передать замыкание. Проверка пройдет, если замыкание вернет true:
$response->assertSessionHas($key, function (User $value) {
return $value->name === 'Taylor Otwell';
});
#assertSessionHasInput
Проверяет, что сессия содержит указанное значение в флеш-массиве input:
$response->assertSessionHasInput($key, $value = null);
При необходимости в качестве второго аргумента методу assertSessionHasInput можно передать замыкание. Проверка пройдет, если замыкание вернет true:
use Illuminate\Support\Facades\Crypt;
$response->assertSessionHasInput($key, function (string $value) {
return Crypt::decryptString($value) === 'secret';
});
#assertSessionHasAll
Проверяет, что сессия содержит указанный массив пар ключ/значение:
$response->assertSessionHasAll(array $data);
Например, если в сессии вашего приложения есть ключи name и status, вы можете проверить, что оба существуют и имеют указанные значения следующим образом:
$response->assertSessionHasAll([
'name' => 'Taylor Otwell',
'status' => 'active',
]);
#assertSessionHasErrors
Проверяет, что сессия содержит ошибку для указанных $keys. Если $keys — ассоциативный массив, проверяется, что сессия содержит конкретное сообщение об ошибке (значение) для каждого поля (ключа). Этот метод следует использовать при тестировании маршрутов, которые сохраняют ошибки валидации в сессии, а не возвращают их в JSON:
$response->assertSessionHasErrors(
array $keys = [], $format = null, $errorBag = 'default'
);
Например, чтобы проверить, что поля name и email имеют сообщения об ошибках валидации, сохранённые в сессии, вызовите метод assertSessionHasErrors так:
$response->assertSessionHasErrors(['name', 'email']);
Или можно проверить, что для конкретного поля есть определённое сообщение об ошибке:
$response->assertSessionHasErrors([
'name' => 'The given name was invalid.'
]);
Более общий метод assertInvalid можно использовать для проверки, что ответ содержит ошибки валидации, возвращённые в JSON, или что ошибки были сохранены в сессии.
#assertSessionHasErrorsIn
Проверяет, что сессия содержит ошибку для указанных $keys в конкретном error bag. Если $keys — ассоциативный массив, проверяется, что сессия содержит конкретное сообщение об ошибке (значение) для каждого поля (ключа) в этом error bag:
$response->assertSessionHasErrorsIn($errorBag, $keys = [], $format = null);
#assertSessionHasNoErrors
Проверяет, что в сессии отсутствуют ошибки валидации:
$response->assertSessionHasNoErrors();
#assertSessionDoesntHaveErrors
Проверяет, что в сессии отсутствуют ошибки валидации для указанных ключей:
$response->assertSessionDoesntHaveErrors($keys = [], $format = null, $errorBag = 'default');
Более общий метод assertValid можно использовать для проверки, что в ответе нет ошибок валидации, возвращённых в JSON, и что ошибки не были сохранены в сессии.
#assertSessionMissing
Проверяет, что сессия не содержит указанный ключ:
$response->assertSessionMissing($key);
#assertStatus
Проверяет, что ответ имеет указанный HTTP статус код:
$response->assertStatus($code);
#assertSuccessful
Проверяет, что ответ имеет успешный HTTP статус код (>= 200 и < 300):
$response->assertSuccessful();
#assertTooManyRequests
Проверяет, что ответ имеет HTTP статус код "слишком много запросов" (429):
$response->assertTooManyRequests();
#assertUnauthorized
Проверяет, что ответ имеет HTTP статус код "неавторизован" (401):
$response->assertUnauthorized();
#assertUnprocessable
Проверяет, что ответ имеет HTTP статус код "необрабатываемый" (422):
$response->assertUnprocessable();
#assertUnsupportedMediaType
Проверяет, что ответ имеет HTTP статус код "неподдерживаемый тип медиа" (415):
$response->assertUnsupportedMediaType();
#assertValid
Проверяет, что в ответе отсутствуют ошибки валидации для указанных ключей. Этот метод можно использовать для проверки ответов, где ошибки валидации возвращаются в JSON-структуре или были сохранены в сессии:
// Проверить, что ошибок валидации нет...
$response->assertValid();
// Проверить, что для указанных ключей нет ошибок валидации...
$response->assertValid(['name', 'email']);
#assertInvalid
Проверяет, что ответ содержит ошибки валидации для указанных ключей. Этот метод можно использовать для проверки ответов, где ошибки валидации возвращаются в JSON-структуре или были сохранены в сессии:
$response->assertInvalid(['name', 'email']);
Также можно проверить, что для указанного ключа есть конкретное сообщение об ошибке валидации. При этом можно указать полное сообщение или его часть:
$response->assertInvalid([
'name' => 'The name field is required.',
'email' => 'valid email address',
]);
#assertViewHas
Проверяет, что в представлении ответа содержится указанный фрагмент данных:
$response->assertViewHas($key, $value = null);
Передача замыкания в качестве второго аргумента метода assertViewHas позволяет проверить и сделать утверждения относительно конкретного элемента данных представления:
$response->assertViewHas('user', function (User $user) {
return $user->name === 'Taylor';
});
Кроме того, данные представления могут быть доступны как элементы массива в ответе, что позволяет удобно их проверять:
$this->assertEquals('Taylor', $response['name']);
#assertViewHasAll
Проверяет, что в представлении ответа присутствует указанный список данных:
$response->assertViewHasAll(array $data);
Этот метод можно использовать для проверки, что представление содержит данные с указанными ключами:
$response->assertViewHasAll([
'name',
'email',
]);
Или можно проверить, что данные представления присутствуют и имеют конкретные значения:
$response->assertViewHasAll([
'name' => 'Taylor Otwell',
'email' => 'taylor@example.com,',
]);
#assertViewIs
Проверяет, что указанный view был возвращён маршрутом:
$response->assertViewIs($value);
#assertViewMissing
Проверяет, что указанный ключ данных не был передан в представление, возвращённое в ответе приложения:
$response->assertViewMissing($key);
#Проверки аутентификации
Laravel также предоставляет различные проверки, связанные с аутентификацией, которые вы можете использовать в функциональных тестах вашего приложения. Обратите внимание, что эти методы вызываются непосредственно в тестовом классе, а не на экземпляре Illuminate\Testing\TestResponse, возвращаемом методами вроде get и post.
#assertAuthenticated
Проверяет, что пользователь аутентифицирован:
$this->assertAuthenticated($guard = null);
#assertGuest
Проверяет, что пользователь не аутентифицирован:
$this->assertGuest($guard = null);
#assertAuthenticatedAs
Проверяет, что аутентифицирован конкретный пользователь:
$this->assertAuthenticatedAs($user, $guard = null);
#Проверки валидации
Laravel предоставляет два основных метода для проверки валидации, которые позволяют убедиться, что данные в вашем запросе были либо корректными, либо некорректными.
#assertValid
Проверяет, что в ответе отсутствуют ошибки валидации для указанных ключей. Этот метод можно использовать для проверки ответов, где ошибки валидации возвращаются в формате JSON или были сохранены в сессии:
// Проверить, что ошибок валидации нет...
$response->assertValid();
// Проверить, что для указанных ключей нет ошибок валидации...
$response->assertValid(['name', 'email']);
#assertInvalid
Проверяет, что в ответе присутствуют ошибки валидации для указанных ключей. Этот метод можно использовать для проверки ответов, где ошибки валидации возвращаются в формате JSON или были сохранены в сессии:
$response->assertInvalid(['name', 'email']);
Также можно проверить, что для конкретного ключа присутствует определённое сообщение об ошибке валидации. При этом можно указать полное сообщение или его часть:
$response->assertInvalid([
'name' => 'The name field is required.',
'email' => 'valid email address',
]);