Версія фреймворка: 8.x

Тести HTTP

Вступ

Laravel пропонує дуже вільний 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метод робить aGETзапит до програми, тоді якassertStatusметод стверджує, що повернута відповідь повинна мати вказаний код стану HTTP. На додаток до цього простого Assertions, Laravel також містить безліч Assertions для перевірки заголовків відповідей, вмісту, структури 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,
            ]);
    }
}
Middleware CSRF автоматично вимикається під час запуску тестів.

Cookies

Ви можете використовуватиwithCookieабоwithCookiesметоди встановлення значень файлів cookie перед поданням запиту.withCookieметод приймає як два аргументи ім'я та значення файлу cookie, тоді як файлwithCookiesметод приймає масив пар ім'я / значення:

<?php

class ExampleTest extends TestCase
{
    public function testCookies()
    {
        $response = $this->withCookie('color', 'blue')->get('/');

        $response = $this->withCookies([
            'color' => 'blue',
            'name' => 'Taylor',
        ])->get('/');
    }
}

Відповіді на Debugging

Після View запиту на тестування до вашої програми,dump,dumpHeaders, іdumpSessionметоди можуть бути використані для вивчення та Debugging вмісту відповіді:

<?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->dumpSession();

        $response->dump();
    }
}

Сесія / Аутентифікація

Laravel надає кілька помічників для роботи з сеансом під час тестування HTTP. По-перше, ви можете встановити дані сеансу для заданого масиву, використовуючиwithSessionметод. Це корисно для завантаження сеансу даними перед Viewм запиту до вашої програми:

<?php

class ExampleTest extends TestCase
{
    public function testApplication()
    {
        $response = $this->withSession(['foo' => 'bar'])
                         ->get('/');
    }
}

Одним із загальних видів використання сеансу є підтримка стану для аутентифікованого користувача.actingAshelper метод забезпечує простий спосіб автентифікації даного користувача як поточного користувача. Наприклад, ми можемо використовувати aмодельний Factoryдля створення та автентифікації користувача:

<?php

use App\Models\User;

class ExampleTest extends TestCase
{
    public function testApplication()
    {
        $user = User::factory()->create();

        $response = $this->actingAs($user)
                         ->withSession(['foo' => 'bar'])
                         ->get('/');
    }
}

Ви також можете вказати, який захист слід використовувати для автентифікації даного користувача, передавши ім'я охорони як другий аргументactingAsметод:

$this->actingAs($user, 'api')

Тестування JSON API

Laravel також надає кілька помічників для тестування API JSON та їх відповідей. Наприклад,json,getJson,postJson,putJson,patchJson,deleteJson, іoptionsJsonметоди можуть бути використані для видачі запитів JSON з різними HTTP-дієсловами. Ви також можете легко передавати дані та заголовки цим методам. Для початку давайте напишемо тест, щоб скластиPOSTзапит до/userі стверджуйте, що очікувані дані були повернуті:

<?php

class ExampleTest extends TestCase
{
    /**
     * A basic functional test example.
     *
     * @return void
     */
    public function testBasicExample()
    {
        $response = $this->postJson('/user', ['name' => 'Sally']);

        $response
            ->assertStatus(201)
            ->assertJson([
                'created' => true,
            ]);
    }
}
TheassertJsonметод перетворює відповідь на масив і використовуєPHPUnit::assertArraySubsetщоб переконатися, що даний масив існує у відповіді JSON, що повертається додатком. Отже, якщо у відповіді JSON є інші властивості, цей тест все одно пройде, доки присутній даний фрагмент.

Крім того, дані відповіді JSON можуть бути доступні як змінні масиву відповіді:

$this->assertTrue($response['created']);

Перевірка точного збігу 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,
            ]);
    }
}

Перевірка шляхів JSON

Якщо ви хочете перевірити, що відповідь JSON містить деякі дані за вказаним шляхом, вам слід скористатисяassertJsonPathметод:

<?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)
            ->assertJsonPath('team.owner.name', 'foo');
    }
}

Тестування завантаження файлів

Illuminate\Http\UploadedFileклас забезпечує afakeметод, який може бути використаний для створення фіктивних файлів або зображень для тестування. Це в поєднанні зStorage facade's fakeметод значно спрощує перевірку завантаження файлів. Наприклад, ви можете поєднати ці дві функції, щоб легко перевірити форму для завантаження аватара:

<?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);

Якщо потрібно, ви можете здати$mimeTypeаргумент методу для явного визначення типу MIME, який повинен бути повернутий файлом:

UploadedFile::fake()->create('document.pdf', $sizeInKilobytes, 'application/pdf');

Перевірка Views

Laravel дозволяє візуалізувати View ізольовано, не роблячи змодельований HTTP-запит до програми. Для цього ви можете використовуватиviewу вашому тесті.viewметод приймає ім'я View та необов'язковий масив даних. Метод повертає екземплярIlluminate\Testing\TestView, який пропонує кілька методів, щоб зручно висловлювати Assertions про вміст View:

public function testWelcomeView()
{
    $view = $this->view('welcome', ['name' => 'Taylor']);

    $view->assertSee('Taylor');
}

TestViewоб'єкт забезпечує наступні методи Assertions:assertSee,assertSeeInOrder,assertSeeText,assertSeeTextInOrder,assertDontSee, іassertDontSeeText.

Якщо потрібно, ви можете отримати необроблений, відтворений вміст View, додавши файлTestViewекземпляр до рядка:

$contents = (string) $this->view('welcome');

Помилки спільного використання

Деякі перегляди можуть залежати від помилок, які поділяються у загальній сумці помилок, наданій Laravel. Щоб зволожити пакет помилок повідомленнями про помилки, ви можете використовуватиwithViewErrorsметод:

$view = $this->withViewErrors([
    'name' => ['Please provide a valid name.']
])->view('form');

$view->assertSee('Please provide a valid name.');

Візуалізація Blade та компонентів

Якщо потрібно, ви можете використовуватиbladeметод для оцінки та візуалізації необробленого рядка Blade. Подобаєтьсяviewметод,bladeметод повертає екземплярIlluminate\Testing\TestView:

$view = $this->blade(
    '<x-component :name="$name" />',
    ['name' => 'Taylor']
);

$view->assertSee('Taylor');

Ви можете використовуватиcomponentметод оцінки та візуалізації компонента Blade. Подобаєтьсяviewметод,componentметод повертає екземплярIlluminate\Testing\TestView:

$view = $this->component(Profile::class, ['name' => 'Taylor']);

$view->assertSee('Taylor');

Доступні Assertions

Assertions відповіді

Laravel пропонує різноманітні власні методи Assertions для вашогоPHPUnitтести характеристик. До цих Assertiors можна отримати доступ у відповіді, що повертається зjson,get,post,put, іdeleteметоди випробування:

assertCookie

Стверджуйте, що відповідь містить вказаний файл cookie:

$response->assertCookie($cookieName, $value = null);

assertCookieExpired

Стверджуйте, що відповідь містить вказаний файл cookie і термін його дії минув:

$response->assertCookieExpired($cookieName);

затвердити Файл cookie не закінчився

Стверджуйте, що відповідь містить вказаний файл cookie і термін його дії не минув:

$response->assertCookieNotExpired($cookieName);

assertCookieMissing

Стверджуємо, що відповідь не містить вказаний файл cookie:

$response->assertCookieMissing($cookieName);

assertCreated

Стверджуйте, що відповідь має 201 код стану:

$response->assertCreated();

assertDontSee

Стверджуйте, що заданий рядок не міститься у відповіді. Це Assertions автоматично уникне даного рядка, якщо ви не передасте другий аргументfalse:

$response->assertDontSee($value, $escaped = true);

assertDontSeeText

Стверджуйте, що заданий рядок не міститься в тексті відповіді. Це Assertions автоматично уникне даного рядка, якщо ви не передасте другий аргументfalse:

$response->assertDontSeeText($value, $escaped = true);

assertExactJson

Стверджуйте, що відповідь містить точну відповідність даних JSON:

$response->assertExactJson(array $data);

стверджуватиЗаборонено

Стверджуйте, що відповідь має заборонений (403) код стану:

$response->assertForbidden();

assertHeader

Стверджуйте, що вказаний заголовок присутній у відповіді:

$response->assertHeader($headerName, $value = null);

assertHeaderMissing

Стверджуйте, що вказаного заголовка немає у відповіді:

$response->assertHeaderMissing($headerName);

assertJson

Стверджуємо, що відповідь містить дані JSON:

$response->assertJson(array $data, $strict = false);

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);

assertJson Відсутні помилки перевірки

Стверджуємо, що відповідь не має помилок перевірки JSON для даних ключів:

$response->assertJsonMissingValidationErrors($keys);

assertJsonPath

Стверджуйте, що відповідь містить дані щодо вказаного шляху:

$response->assertJsonPath($path, array $data, $strict = true);

assertJsonStructure

Стверджуємо, що відповідь має задану структуру JSON:

$response->assertJsonStructure(array $structure);

assertJsonValidationErrors

Стверджуємо, що відповідь має дані про помилки перевірки JSON:

$response->assertJsonValidationErrors(array $data);

assertLocation

Стверджуйте, що відповідь має задане значення URI вLocationзаголовок:

$response->assertLocation($uri);

assertNoContent

Стверджуйте, що відповідь має заданий код стану і не містить вмісту.

$response->assertNoContent($status = 204);

assertNotFound

Стверджуйте, що відповідь має не знайдений код стану:

$response->assertNotFound();

assertOk

Стверджуйте, що відповідь має код стану 200:

$response->assertOk();

assertPlainCookie

Стверджуємо, що відповідь містить вказаний файл cookie (незашифрований):

$response->assertPlainCookie($cookieName, $value = null);

assertRedirect

Стверджуйте, що відповідь є переспрямуванням на даний URI:

$response->assertRedirect($uri);

затвердитиДив

Стверджуйте, що заданий рядок міститься у відповіді. Це Assertions автоматично уникне даного рядка, якщо ви не передасте другий аргументfalse:

$response->assertSee($value, $escaped = true);

assertSeeInOrder

Стверджуйте, що задані рядки містяться в порядку відповіді у відповіді. Це Assertions автоматично уникне даних рядків, якщо ви не передасте другий аргументfalse:

$response->assertSeeInOrder(array $values, $escaped = true);

assertSeeText

Стверджуйте, що заданий рядок міститься в тексті відповіді. Це Assertions автоматично уникне даного рядка, якщо ви не передасте другий аргументfalse:

$response->assertSeeText($value, $escaped = true);

assertSeeTextInOrder

Стверджуйте, що дані рядки містяться в порядку відповіді у тексті відповіді. Це Assertions автоматично уникне даних рядків, якщо ви не передасте другий аргументfalse:

$response->assertSeeTextInOrder(array $values, $escaped = true);

assertSessionHas

Стверджуйте, що сеанс містить вказаний фрагмент даних:

$response->assertSessionHas($key, $value = null);

assertSessionHasInput

Стверджуємо, що сеанс має задане значення у прошитому масиві вводу:

$response->assertSessionHasInput($key, $value = null);

assertSessionHasAll

Стверджуємо, що сеанс має заданий список значень:

$response->assertSessionHasAll(array $data);

assertSessionHasErrors

Стверджуйте, що сеанс містить помилку для даного$keys. Якщо$keysє асоціативним масивом, стверджуємо, що сеанс містить певне повідомлення про помилку (значення) для кожного поля (ключа):

$response->assertSessionHasErrors(array $keys, $format = null, $errorBag = 'default');

assertSessionHasErrors

Стверджуйте, що сеанс містить помилку для даного$keys, у межах певного пакету помилок. Якщо$keysє асоціативним масивом, стверджуємо, що сеанс містить певне повідомлення про помилку (значення) для кожного поля (ключа), що знаходиться в пакеті помилок:

$response->assertSessionHasErrorsIn($errorBag, $keys = [], $format = null);

assertSessionHasErrors

Стверджуйте, що сеанс не має помилок:

$response->assertSessionHasNoErrors();

assertSessionDoesntHaveErrors

Стверджуємо, що сеанс не має помилок для даних ключів:

$response->assertSessionDoesntHaveErrors($keys = [], $format = null, $errorBag = 'default');

assertSessionMissing

Стверджуйте, що сеанс не містить заданий ключ:

$response->assertSessionMissing($key);

assertStatus

Стверджуйте, що відповідь має заданий код:

$response->assertStatus($code);

assertSuccessful

Стверджуйте, що відповідь має успішний (> = 200 та <300) код стану:

$response->assertSuccessful();

assertUauthorized

Стверджуйте, що відповідь має несанкціонований (401) код стану:

$response->assertUnauthorized();

assertViewHas

Стверджуйте, що View відповіді отримало частину даних:

$response->assertViewHas($key, $value = null);

Крім того, дані перегляду можуть бути доступні як змінні масиву у відповіді:

$this->assertEquals('Taylor', $response['name']);

assertViewHasAll

Стверджуйте, що View відповідей має заданий список даних:

$response->assertViewHasAll(array $data);

assertViewIs

Стверджуйте, що даний Шаблон було повернуто маршрутом:

$response->assertViewIs($value);

assertViewMissing

Запевнити, що у поданні відповіді відсутній фрагмент пов’язаних даних:

$response->assertViewMissing($key);

Ствердження автентифікації

Laravel також надає різноманітні Assertions щодо вашої автентифікації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); Стверджуйте, що дані облікові дані недійсні.