Laravel (5.7) HTTP-тесты
Вступление
Laravel предоставляет нам очень удобный API для отправки запросов к нашему приложению и проверки результатов. Например, рассмотрим тест, определенный ниже:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
class ExampleTest extends TestCase
{
/**
* A basic test example.
*
* @return void
*/
public function testBasicTest()
{
$response = $this->get('/');
$response->assertStatus(200);
}
}
Метод get отправит запрос GET в приложение, а метод assertStatus подтвердит, что возвращенный ответ должен иметь заданный код состояния HTTP. Laravel не ограничивается этим простым утверждением, он также содержит различные утверждения для проверки заголовков ответа, содержимого, структуры 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,
]);
}
Сессия / Аутентификация
Laravel предоставляет нам несколько помощников для работы с сеансом во время HTTP-тестирования. Во-первых, вы можете установить данные сеанса для данного массива, используя метод withSession. Это очень полезно для загрузки сеанса с данными перед отправкой запроса в ваше приложение:
<?php
class ExampleTest extends TestCase
{
public function testApplication()
{
$response = $this->withSession(['foo' => 'bar'])
->get('/');
}
}
Обычное использование сеанса заключается в поддержании состояния для аутентифицированного пользователя. Вспомогательный метод actAs обеспечит простой способ аутентификации данного пользователя в качестве текущего пользователя. Например, вы можете использовать фабрику моделей для генерации и аутентификации пользователя:
<?php
use App\User;
class ExampleTest extends TestCase
{
public function testApplication()
{
$user = factory(User::class)->create();
$response = $this->actingAs($user)
->withSession(['foo' => 'bar'])
->get('/');
}
}
Вы также можете указать, какой сторож следует использовать для аутентификации данного пользователя, передавая имя сторожа в качестве второго аргумента в действующий метод:
$this->actingAs($user, 'api')
Тестирование API JSON
Laravel также предоставляет вам несколько помощников для тестирования API-интерфейсов JSON и их ответов. Например, методы json, get, post, put, patch и delete могут использоваться для выдачи запросов с различными 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
Если вы хотите убедиться, что данный массив является точным соответствием для 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,
]);
}
}
Тестирование загрузки файлов
Класс IlluminateHttpUploadedFile предоставляет поддельный метод, который можно использовать для создания фиктивных файлов или изображений для тестирования. Когда это комбинируется с поддельным методом Storage фасад, это значительно упрощает тестирование загрузки файлов. Например, вы можете легко объединить эти две функции для проверки формы загрузки аватара:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
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');
}
}
Поддельные настройки файла
Всякий раз, когда вы создаете файлы с использованием поддельного метода, вы можете указать ширину, высоту и размер изображения, чтобы лучше проверить правила проверки:
UploadedFile::fake()->image('avatar.jpg', $width, $height)->size(100);
Помимо создания изображений, вы также можете создавать файлы любого другого типа, используя метод create:
UploadedFile::fake()->create('document.pdf', $sizeInKilobytes);
Доступные утверждения
Ответные утверждения
Laravel предоставляет вам множество пользовательских методов подтверждения для ваших тестов PHPUnit. К этим утверждениям можно получить доступ в ответе, который возвращается из методов тестирования json, get, post, put и delete:
название | Описание | Код |
---|---|---|
assertCookie | Это подтверждает, что ответ содержит данный файл cookie: | $ response-> assertCookie ($ cookieName, $ value = null); |
assertCookieExpired | Это подтверждает, что в ответе содержится данный файл cookie и срок его действия истек: | $ Response-> assertCookieExpired ($ cookieName); |
assertCookieNotExpired | Это подтверждает, что в ответе содержится данный файл cookie, и срок его действия не истек: | $ Response-> assertCookieNotExpired ($ cookieName); |
assertCookieMissing | Это подтверждает, что ответ не содержит данный файл cookie: | $ Response-> assertCookieMissing ($ cookieName); |
assertDontSee | Это утверждает, что данная строка не содержится в ответе: | $ Response-> assertDontSee ($ значение); |
assertDontSeeText | Это подтверждает, что данная строка не содержится в тексте ответа: | $ Response-> assertDontSeeText ($ значение); |
assertExactJson | Это подтверждает, что ответ содержит точное соответствие данных JSON: | $ response-> assertExactJson (массив $ data); |
assertForbidden | Это утверждает, что ответ имеет запрещенный код состояния: | $ Response-> assertForbidden (); |
assertHeader | Это подтверждает, что данный заголовок присутствует в ответе: | $ response-> assertHeader ($ headerName, $ value = null); |
assertHeaderMissing | Это утверждает, что данный заголовок отсутствует в ответе: | $ Response-> assertHeaderMissing ($ HeaderName); |
assertJson | Это подтверждает, что ответ содержит данные JSON: | $ response-> assertJson (массив $ data); |
assertJsonCount | Это утверждает, что ответ JSON имеет массив с ожидаемым количеством элементов в данном ключе: | $ response-> assertJsonCount ($ count, $ key = null); |
assertJsonFragment | Это подтверждает, что ответ содержит данный фрагмент JSON: | $ response-> assertJsonFragment (массив $ data); |
assertJsonMissing | Это подтверждает, что ответ не содержит данный фрагмент JSON: | $ response-> assertJsonMissing (массив $ data); |
assertJsonMissingExact | Это утверждает, что ответ не содержит точный фрагмент JSON: | $ response-> assertJsonMissingExact (массив $ data); |
assertJsonMissingValidationErrors | Это подтверждает, что в ответе нет ошибок проверки JSON для данных ключей: | $ Response-> assertJsonMissingValidationErrors ($ ключей); |
assertJsonStructure | Это подтверждает, что ответ имеет заданную структуру JSON: | $ response-> assertJsonStructure (array $ structure); |
assertJsonValidationErrors | Это подтверждает, что в ответе указаны ошибки проверки JSON для указанных ключей: | $ Response-> assertJsonValidationErrors ($ ключей); |
assertLocation | Таким образом, утверждает, что ответ имеет заданное значение URI в заголовке Location: | $ Response-> assertLocation ($ URI); |
assertNotFound | Это подтверждает, что ответ имеет не найденный код состояния: | $ Response-> assertNotFound (); |
assertOk | Это утверждает, что ответ имеет 200 кодов состояния: | $ Response-> assertOk (); |
assertPlainCookie | Это подтверждает, что ответ содержит указанный файл cookie (незашифрованный): | $ response-> assertPlainCookie ($ cookieName, $ value = null); |
assertRedirect | Это подтверждает, что ответ является перенаправлением на заданный URI: | $ Response-> assertRedirect ($ URI); |
assertSee | Это подтверждает, что данная строка содержится в ответе: | $ Response-> assertSee ($ значение); |
assertSeeInOrder | Это подтверждает, что указанные строки содержатся в порядке в ответе: | $ response-> assertSeeInOrder (массив $ values); |
assertSeeText | Это подтверждает, что данная строка содержится в тексте ответа: | $ Response-> assertSeeText ($ значение); |
assertSeeTextInOrder | Это подтверждает, что указанные строки содержатся в порядке в тексте ответа: | $ response-> assertSeeTextInOrder (массив $ values); |
assertSessionHas | Это подтверждает, что сеанс содержит данный фрагмент данных: | $ response-> assertSessionHas ($ key, $ value = null); |
assertSessionHasAll | Это подтверждает, что у сеанса есть заданный список значений: | $ response-> assertSessionHasAll (массив $ data); |
assertSessionHasErrors | Это подтверждает, что сеанс содержит ошибку для данного поля: | $ response-> assertSessionHasErrors (массив $ 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 ($ ключ); |
assertStatus | Это утверждает, что ответ имеет заданный код: | $ Response-> assertStatus ($ код); |
assertSuccessful | Это подтверждает, что ответ имеет успешный код состояния: | $ Response-> assertSuccessful (); |
assertViewHas | Это подтверждает, что представлению ответа был предоставлен фрагмент данных: | $ response-> assertViewHas ($ key, $ value = null); |
assertViewHasAll | Это утверждает, что представление ответа имеет заданный список данных: | $ response-> assertViewHasAll (массив $ data); |
assertViewIs | Это подтверждает, что данный вид был возвращен маршрутом: | $ Response-> assertViewIs ($ значение); |
assertViewMissing | Это подтверждает, что в представлении ответа отсутствует часть связанных данных: | $ Response-> assertViewMissing ($ ключ); |
Утверждения аутентификации
Laravel предоставляет различные проверки подлинности для наших тестов PHPUnit
метод | Описание |
---|---|
$ this-> assertAuthenticated ($ guard = null); | Утверждает, что пользователь аутентифицирован. |
$ this-> assertGuest ($ guard = null); | Утверждает, что пользователь не аутентифицирован. |
$ this-> assertAuthenticatedAs ($ user, $ guard = null); | Утверждает, что данный пользователь аутентифицирован. |
$ this-> assertCredentials (массив $ credentials, $ guard = null); | Утверждают, что данные учетные данные действительны. |
$ this-> assertInvalidCredentials (массив $ credentials, $ guard = null); | Утверждают, что данные учетные данные являются недействительными. |
Новый контент: Composer: менеджер зависимостей для PHP , R программирования