Unetway

Laravel - Тесты HTTP

Вступление

Laravel предоставляет очень удобный API для выполнения HTTP-запросов к вашему приложению и проверки результатов. Например, взгляните на тест, определенный ниже:

<?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,
            ]);
    }
}

Промежуточное программное обеспечение CSRF автоматически отключается при запуске тестов.

 

Отладка ответов

После выполнения тестового запроса к вашему приложению можно использовать методы dumpи dumpHeadersдля проверки и отладки содержимого ответа:

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

        $response->dump();
    }
}

 

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

Laravel предоставляет несколько помощников для работы с сеансом во время 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')

 

Тестирование API JSON

Laravel также предоставляет несколько помощников для тестирования API-интерфейсов JSON и их ответов. Так , например, jsongetpostputpatch, и 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,
            ]);
    }
}

assertJsonМетод преобразует ответ на массив и использует , чтобы убедиться , что данный массив существует в ответ JSON , возвращаемом приложением. Таким образом, если в ответе JSON есть другие свойства, этот тест будет проходить до тех пор, пока присутствует данный фрагмент.PHPUnit::assertArraySubset

 

Проверка точного соответствия 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,
            ]);
    }
}

 

Тестирование загрузки файлов

Класс предоставляет метод , который может быть использован для создания фиктивных файлов или изображений для тестирования. Это в сочетании с методом фасада значительно упрощает тестирование загрузки файлов. Например, вы можете объединить эти две функции, чтобы легко протестировать форму загрузки аватара:Illuminate\Http\UploadedFilefakeStoragefake

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

Поддельные настройки файла

При создании файлов с использованием этого fakeметода вы можете указать ширину, высоту и размер изображения, чтобы лучше проверить свои правила проверки:

UploadedFile::fake()->image('avatar.jpg', $width, $height)->size(100);

Помимо создания изображений вы можете создавать файлы любого другого типа, используя createметод:

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

 

Доступные утверждения

Ответные утверждения

Laravel предоставляет множество пользовательских методов подтверждения для ваших тестов PHPUnit . Эти утверждения могут быть доступны на ответ , который возвращается из jsongetpostput, и deleteметодов испытаний:

assertCookieassertCookieExpiredassertCookieNotExpiredassertCookieMissingassertDontSeeassertDontSeeTextassertExactJsonassertForbiddenassertHeaderassertHeaderMissingassertJsonassertJsonCountassertJsonFragmentassertJsonMissingassertJsonMissingExactassertJsonMissingValidationErrorsassertJsonStructureassertJsonValidationErrorsassertLocationassertNotFoundassertOkassertPlainCookieassertRedirectassertSeeassertSeeInOrderassertSeeTextassertSeeTextInOrderassertSessionHasassertSessionHasAllassertSessionHasErrorsassertSessionHasErrorsInassertSessionHasNoErrorsassertSessionDoesntHaveErrorsassertSessionMissingassertStatusassertSuccessfulassertViewHasassertViewHasAllassertViewIsassertViewMissing

 

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($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($keys);

 

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($value);

 

assertSeeInOrder

Утверждают, что указанные строки содержатся в порядке в ответе:

$response->assertSeeInOrder(array $values);

 

assertSeeText

Утверждают, что данная строка содержится в тексте ответа:

$response->assertSeeText($value);

 

assertSeeTextInOrder

Утверждают, что указанные строки содержатся в порядке в тексте ответа:

$response->assertSeeTextInOrder(array $values);

 

assertSessionHas

Утверждают, что сессия содержит данный фрагмент данных:

$response->assertSessionHas($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

Подтвердите, что ответ имеет успешный код состояния:

$response->assertSuccessful();

 

assertViewHas

Утверждают, что представлению ответа был предоставлен фрагмент данных:

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

 

assertViewHasAll

Утвердите, что представление ответа имеет заданный список данных:

$response->assertViewHasAll(array $data);

 

assertViewIs

Утверждают, что данный вид был возвращен по маршруту:

$response->assertViewIs($value);

 

assertViewMissing

Утвердите, что в представлении ответа отсутствует часть связанных данных:

$response->assertViewMissing($key);

 

Утверждения аутентификации

Laravel также предоставляет различные проверки подлинности для ваших тестов 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); Утверждают, что данные учетные данные являются недействительными.