Посредники CSRF автоматически отключаются при выполнении тестов.
HTTP тесты
Содержание:
- Введение
- Сессия и аутентификация
- Тестирование JSON APIs
- Тестирование загрузки файлов
- Доступные утверждения
Введение
Ларавел предоставляет гибкий API для создания запросов HTTP для вашего приложения и проверки ответов. Например, давайте взглянем на тест опрделённый ниже:
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* A basic test example.
*
* @return void
*/
public function testBasicTest()
{
$response = $this->get('/');
$response->assertStatus(200);
}
}
Метод get
отправляет запрос GET
в ваше приложение,
в то время как метод assertStatus
декларирует, что возвращаемый ответ должен
иметь данный HTTP статус код.
Дополнительно к данной простой декларации, Ларавел также включает набор деклараций для
проверки заголовков, контента, JSON структуры и других данных ответа.
Настройка заголовков запроса
Вы можете использовать метод withHeaders
для настройки заголовков до момента
отправки их в приложение. Это позволяет вам добавлять пользовательские заголовки,
которые вы бы добавили к запросу:
<?php
class ExampleTest extends TestCase
{
/**
* A basic functional test example.
*
* @return void
*/
public function testBasicExample()
{
$response = $this->withHeaders([
'X-Header' => 'Value',
])->json('POST', '/user', ['name' => 'Sally']);
$response
->assertStatus(201)
->assertJson([
'created' => true,
]);
}
}
Отладка ответов
После создания тестового запроса в ваше приложение, методы dump
и
dumpHeaders
могут быть использованы для проверки и отладки
содержимого ответов:
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* A basic test example.
*
* @return void
*/
public function testBasicTest()
{
$response = $this->get('/');
$response->dumpHeaders();
$response->dump();
}
}
Сессия и аутентификация
Ларавел предоставляет несколько помощников для работы с сессией во время HTTP тестирования.
Во-первых, вы можете установить данные сессии как указанный массив используя метод
withSession
. Это практично загружать данные сессии до отправки запроса
в ваше приложение:
<?php
class ExampleTest extends TestCase
{
public function testApplication()
{
$response = $this->withSession(['foo' => 'bar'])
->get('/');
}
}
Работа с пользователями и аутентификацией является одним из частых случаев работы с сессиями.
Метод-помощник actingAs
предоставляет простой путь аутентифицировать данного
пользователя как текущего пользователя. Например, мы можем использовать
фабрику моделей,
для генерации аутентифицированного пользователя:
<?php
use App\User;
class ExampleTest extends TestCase
{
public function testApplication()
{
$user = factory(User::class)->create();
$response = $this->actingAs($user)
->withSession(['foo' => 'bar'])
->get('/');
}
}
Вы также можете указать, какой страж должен быть использон для аутентификации данного пользователя
путём передачи имени стража в качестве второго аргумента в метод actingAs
:
$this->actingAs($user, 'api')
Тестирование JSON APIs
Laravel также предоставляет несколкьо помощников для тестирования JSON API и их ответов.
Например, методы json
, get
, post
, put
,
patch
, delete
, и option
могут быть использованы для
для отправки запросов с различными HTTP-действиями. Вы также можете легко передавать
данные и заголовки в эти методы. Для начала, давайте напишем тест, в котором мы делаем
POST
запрос по адресу /user
и убедимся в том,
что вернулсь заявленые данные:
<?php
class ExampleTest extends TestCase
{
/**
* A basic functional test example.
*
* @return void
*/
public function testBasicExample()
{
$response = $this->json('POST', '/user', ['name' => 'Sally']);
$response
->assertStatus(201)
->assertJson([
'created' => true,
]);
}
}
Верификация точного JSON соответствия
Если вы хотите верифицировать, что данный массив точно exact соответсвует
возвращаемому JSON вашим приложением, вы должны использовать метод assertExactJson
:
<?php
class ExampleTest extends TestCase
{
/**
* A basic functional test example.
*
* @return void
*/
public function testBasicExample()
{
$response = $this->json('POST', '/user', ['name' => 'Sally']);
$response
->assertStatus(201)
->assertExactJson([
'created' => true,
]);
}
}
Тестирование загрузки файлов
Класс Illuminate\Http\UploadedFile
предоставляет метод fake
,
который можно использовать для генерации фальшивых файлов или изображений для тестирования.
Если скомбинировать эту возможность с методом fake
для фасада Storage
,
то можно очень упростить тестирование загружаемых файлов.
Например, вы можете успешно сочетать это возможности для тестирования загрузки аватара с формы:
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Tests\TestCase;
class ExampleTest extends TestCase
{
public function testAvatarUpload()
{
Storage::fake('avatars');
$file = UploadedFile::fake()->image('avatar.jpg');
$response = $this->json('POST', '/avatar', [
'avatar' => $file,
]);
// Assert the file was stored...
Storage::disk('avatars')->assertExists($file->hashName());
// Assert a file does not exist...
Storage::disk('avatars')->assertMissing('missing.jpg');
}
}
Настройка фальшивых фалов.
При создании файлов используя метод fake
, вы можете указать ширину, высоту и
размер изображения для лучшего тестирования правил валидации:
UploadedFile::fake()->image('avatar.jpg', $width, $height)->size(100);
Дополнительно к созданию изображений, вы можете создавать файлы любого типа,
используя метод create
:
UploadedFile::fake()->create('document.pdf', $sizeInKilobytes);
Доступные утверждения
Ответ утверждений
Laravel предоставляет набор пользовательских методов заявлений для ваших
PHPUnit тестов.
Эти методы могут быть получены из ответа возвращаемого из тестовых методов
json
, get
, post
, put
,
и delete
:
assertCookie assertCookieExpired assertCookieNotExpired assertCookieMissing assertDontSee assertDontSeeText assertExactJson assertForbidden assertHeader assertHeaderMissing assertJson assertJsonCount assertJsonFragment assertJsonMissing assertJsonMissingExact assertJsonMissingValidationErrors assertJsonStructure assertJsonValidationErrors assertLocation assertNotFound assertOk assertPlainCookie assertRedirect assertSee assertSeeInOrder assertSeeText assertSeeTextInOrder assertSessionHas assertSessionHasInput assertSessionHasAll assertSessionHasErrors assertSessionHasErrorsIn assertSessionHasNoErrors assertSessionDoesntHaveErrors assertSessionMissing assertStatus assertSuccessful assertUnauthorized assertViewHas assertViewHasAll assertViewIs assertViewMissing
assertCookie
Утверждает, что данный ответ содержит данные куки:
$response->assertCookie($cookieName, $value = null);
assertCookieExpired
Утверждает, что данный ответ содержит данные куки и срок их действия истек:
$response->assertCookieExpired($cookieName);
assertCookieNotExpired
Утверждает, что данный ответ содержит данные куки и срок их действия не истек:
$response->assertCookieNotExpired($cookieName);
assertCookieMissing
Утверждает, что данный ответ не содержит данные куки:
$response->assertCookieMissing($cookieName);
assertDontSee
Утверждает, что данная строка не содержится внутри ответа:
$response->assertDontSee($value);
assertDontSeeText
Утверждает, что данная строка не содержится внутри теста ответа:
$response->assertDontSeeText($value);
assertExactJson
Утверждает, что ответ содержит точное вхождение указанные JSON данных:
$response->assertExactJson(array $data);
assertForbidden
Утвеждает, что ответ статус код "запрещено":
$response->assertForbidden();
assertHeader
Утверждает, что данный заголовк присутсвует в ответе:
$response->assertHeader($headerName, $value = null);
assertHeaderMissing
Утверждает, что данный заголовок не присутсвует в ответе:
$response->assertHeaderMissing($headerName);
assertJson
Утверждает, что ответ содержит указанные JSON данные:
$response->assertJson(array $data);
assertJsonCount
Утверждает, что JSON ответ содержит массив с ожидаемым числом элементов в данном ключе:
$response->assertJsonCount($count, $key = null);
assertJsonFragment
Утверждает, что ответ содержит данный JSON фрагмент:
$response->assertJsonFragment(array $data);
assertJsonMissing
Утверждает, что ответ не содержит данный JSON фрагмент:
$response->assertJsonMissing(array $data);
assertJsonMissingExact
Утверждает, что ответ не содержит точного вхождения фрагмента JSON:
$response->assertJsonMissingExact(array $data);
assertJsonMissingValidationErrors
Утверждает, что в ответе нет ошибок валидации JSON для данного ключа:
$response->assertJsonMissingValidationErrors($keys);
assertJsonStructure
Утверждает, что ответ имеет следующую структуру JSON:
$response->assertJsonStructure(array $structure);
assertJsonValidationErrors
Утверждает, что ответ содержит следующие ошибки валидации JSON:
$response->assertJsonValidationErrors(array $data);
assertLocation
Утверждает, что ответ содержит данное значение URI в заголовке Location
:
$response->assertLocation($uri);
assertNotFound
Утверждает, что ответ имеет статус код "не найдено":
$response->assertNotFound();
assertOk
Утверждает, что ответ содержит статус код "200":
$response->assertOk();
assertPlainCookie
Утверждает, что ответ содержит данные куки (незашифрованные):
$response->assertPlainCookie($cookieName, $value = null);
assertRedirect
Утверждаетв, что ответ является перенаправлением на данный URI:
$response->assertRedirect($uri);
assertSee
Утверждает, что данная строка содержится внутри ответа:
$response->assertSee($value);
assertSeeInOrder
Утверждает, что данные выражения содержатся в определённом порядке внутри ответа:
$response->assertSeeInOrder(array $values);
assertSeeText
Утверждает, что данная строка содержится внутри текста ответа:
$response->assertSeeText($value);
assertSeeTextInOrder
Утверждает, что данные строки содержатся в указанном порядке внутри текста ответа:
$response->assertSeeTextInOrder(array $values);
assertSessionHas
Утверждает, что сессия содержит данную часть данных:
$response->assertSessionHas($key, $value = null);
assertSessionHasInput
Утверждает, что сессия имеет данное значение в вводном массиве флеш-данных:
$response->assertSessionHasInput($key, $value = null);
assertSessionHasAll
Утверждает, что сессие имеет данный список значений:
$response->assertSessionHasAll(array $data);
assertSessionHasErrors
Утверждает, что сессия содержит ошибку для данного поля:
$response->assertSessionHasErrors(array $keys, $format = null, $errorBag = 'default');
assertSessionHasErrorsIn
Утверждает, что сессия имеет данные ошибки:
$response->assertSessionHasErrorsIn($errorBag, $keys = [], $format = null);
assertSessionHasNoErrors
Утверждает, что сессия не содержит ошибок:
$response->assertSessionHasNoErrors();
assertSessionDoesntHaveErrors
Утверждает, что сессия не имеет ошибко для данных ключей:
$response->assertSessionDoesntHaveErrors($keys = [], $format = null, $errorBag = 'default');
assertSessionMissing
Утверждает, что сессия не содержит данный ключ:
$response->assertSessionMissing($key);
assertStatus
Утверждает, что ответ содержит указанный статус-код:
$response->assertStatus($code);
assertSuccessful
Утверждает, что ответ имеет успешный статус-код (200):
$response->assertSuccessful();
assertUnauthorized
Утверждает, что ответ содержит статус-код "неавторизованный" (401):
$response->assertUnauthorized();
assertViewHas
Утверждает, что представление ответа содержит указанную часть данных:
$response->assertViewHas($key, $value = null);
assertViewHasAll
Утверждает, что представление ответа имеет следующий список данных:
$response->assertViewHasAll(array $data);
assertViewIs
Утверждает, что данное представление представление возвращено маршрутом:
$response->assertViewIs($value);
assertViewMissing
Утверждает, что у представления ответа не хватает части связанных данных:
$response->assertViewMissing($key);
Аутентификация утверждений
Ларавел также предоставляет набор утверждений, связанных с аутентификацией, для ваших PHPUnit тестов:
Метод | Описание |
---|---|
$this->assertAuthenticated($guard = null); |
Утверждает, что пользователь аутентифицирован. |
$this->assertGuest($guard = null); |
Утверждает, что пользователь не аутентифицирован. |
$this->assertAuthenticatedAs($user, $guard = null); |
Утверждает, что данный пользователь аутентифицирован. |
$this->assertCredentials(array $credentials, $guard = null); |
Утверждает, что данные учетные данные валидны. |
$this->assertInvalidCredentials(array $credentials, $guard = null); |
Утверждает, что данные учетные данные не валидны. |