HTTP тесты

Содержание:


Введение

Ларавел предоставляет гибкий 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,
            ]);
    }
}
Посредники CSRF автоматически отключаются при выполнении тестов.

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

После создания тестового запроса в ваше приложение, методы 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,
            ]);
    }
}
Метод assertJson преобразует ответ в массив и использует PHPUnit::assertArraySubset для верификации, что данный массив существует в возвращаемом JSON ответе вашего приложения. Поэтому, если в вашем JSON ответе есть и другие свойства, этот тест будет считаться выполненным до тех пор, пока указанный фрагмент присутсвует.

Верификация точного 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

Утверждает, что данный ответ содержит данные куки:

$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); Утверждает, что данные учетные данные не валидны.