Пишем сообщество phpland на Laravel - Часть 5

В предыдущий статье мы подключили phpunit feature тесты, которые тестируют функционал модуля аутентификации. В этой статье мы напишем свои тесты для тестирование функионала "Page".

Создадим наш первый тест для тестирования page.index как гость

php artisan make:test Page/PageTest

В папки "tests/Feature/Page" появится новый тест, откроем данный файл и добавим туда наш тест, который будет тестировать - может ли гость просматривать страницу со всеми постами из блога:

<?php

namespace Tests\Page\Feature;

use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;

class PageTest extends TestCase
{

    use RefreshDatabase;
    
    /** @test */
    public function a_guest_can_view_index_page()
    {
        $this->get(route('page.index'))->assertStatus(200);
    }
    
}

Мы можешь писать любые имена для функций (если используем комментарий @test) и в любом стиле (camelCase, snake_case), я выбрал snake_case для тестов, так как их легче читать. Важно чтобы функция максимально хорошо описавала что делает тест. Лучше писать много маленьких тестов, чем один большой.

Мы переходим по маршруту "page.index" (посмотреть список маршрутов можно с помощью artisan) и если HTTP статус код 200, значит всё окей. Если бы страница не работала мы бы получил 404 (не найдено), 500 (фатальная ошибка) или 403 (нет доступа).

Создаём тест для page.index как пользователь

Теперь напишем ещё один тест, который проверит что зарегистрированный пользователь тоже может просматривать эту страницу.


use \App\User;

...

    /** @test */
    public function a_user_can_view_index_page()
    {
        $this->actingAs(factory(User::class)->create())->get(route('page.index'))->assertStatus(200);
    }

Здесь мы используешь actingAs, в который передаём экземпляр объекта User (созданный с помощью Factory), это означает что мы создаём нового пользователя и просматриваем страницу как он бы видел её, если бы вошел. Также как и в первом тесте, мы смотрим на HTTP статус код.

Создаем тест для создание страницы как гость

Гости не могут создавать страницу, поэтому получает ошибку 403 (недостаточно прав или доступ запрещён).

    /** @test */
    public function a_guest_may_not_create_page()
    {
        $this->get(route('page.create'))->assertStatus(403);
    }

Пишем тест для создание страницы как пользователь

В начало класса добавим:

/** @var array */
    public $data = [
        'material_id'    => 'blog',
        'category_id'    => 1,
        'title'          => 'Hallo World',
        'slug'           => 'hello-world',
        'content'        => 'test',
        'status_id'      => 'public',
        'allow_comments' => 1,
        'mainstream'     => 1
    ];

И в конце класса напишем наш тест.

    /** @test */
    public function a_user_can_create_page()
    {

        // we are signed in
        $this->actingAs(factory(User::class)->create());

        // we are on create page
        $this->get(route('page.create'))->assertStatus(200);

        // we submit the form with data
        $this->post(route('page.store'), $this->data)
             ->assertStatus(302)
             ->assertRedirect(route('page.create'))
             ->assertSessionHas('message', 'Страница добавлена!');
    }

Здесь мы создаём нового пользователя, входим на сайт, переходим на страницу "создание страницы", заполняем поля и делаем POST Request. Если страница добавилась, то нас опять перекинит на страницу добавление и мы увидем сообщение "Страница добавлена!".

Пишем тест для редактирование страницы пользователям

/** @test */
    public function a_user_can_edit_page()
    {

        // create a page as user
        $this->a_user_can_create_page();

        // we are on update page
        $this->get(route('page.edit', ['slug' => $this->data['slug']]))->assertStatus(200);

        // we change the title
        $this->data['title'] = "Hello World 2";

        // we submit the form with new title
        $this->patch(route('page.update', ['slug' => $this->data['slug']]), $this->data)
             ->assertStatus(302)
             ->assertRedirect(route('page.edit', ['slug' => $this->data['slug']]))
             ->assertSessionHas('message', 'Страница сохранена!');

    }

После того как мы создали страницу, мы пытаемся её отредактировать, для этого переходим по ссылки для редактирование. Изменяем "заголовок" и сохраняем страницу.

Создаём тест для просмотра отдельной страницы

/** @test */
/** @test */
    public function a_guest_can_view_single_page()
    {

        // create a page as user
        $this->a_user_can_create_page();

        // we are on update page
        $this->get(route('page.show', ['slug' => $this->data['slug']]))->assertStatus(200);

    }

Вот мы и написали phpunit feature тесты для нашей сущности Page. В целом ничего сложного тут нет. Главное понять принцип.

Если мы запустим наши тесты, то увидим:

PHPUnit 7.5.12 by Sebastian Bergmann and contributors.

Time: 1.13 seconds, Memory: 28.00 MB

OK (38 tests, 190 assertions)

Посмотреть всё в виде одного коммита на Github можно здесь: https://github.com/dignityinside/phpland_laravel/commit/d8f3df9c03c0da3b421b769268cd697f51d05561

Бонус

Если вам интересно посмотреть как пишутся phpunit unit тесты, смотрите тут: https://github.com/dignityinside/phpland_laravel/commit/ed0771c47c600a047b54f4dd91dce1e9a1942965

Я написал небольшие тесты, которые проверяют работаспособность ""\App\Helpers".

Для создание phpunit unit тестов, я использовал команду:

php artisan make:test Helpers\TextTest --unit

Созданые тесты находятся в папки "tests/Unit/Helpers".


Оставьте комментарий!

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий:


Написать новый комментарий

Видео

Самые полезные видео на темы "веб-разработка", "Linux" и "IT". Смотри и обучайся!

Подробнее »

Сделки

Самые горячие и выгодные сделки, акции и скидки на видео-курсы, софт, услуги, книги и железо из всего рунета.

Подробнее »

Планета

Наша планета собирает интересные статьи из различных источников и объединяет их в одну ленту. Которую можно читать на нашем сайте.

Подробнее »