Lumen 5.4: PHPUnit: как проверить авторизацию? - PullRequest
0 голосов
/ 22 сентября 2018

Я работаю над проектом электронной коммерции, универсальным книжным магазином.

Я начал с подхода, основанного на тестировании, и полностью придерживался его до сих пор.

Различные конечные точки в этомПроект Lumen Microservice был успешно протестирован ранее, чтобы убедиться, что они выполняют операции CRUD.Однако, поскольку я должен защищать метод Create, Update и Delete с помощью авторизации токена, я не совсем понимаю, как вводить тесты для авторизации.

На данный момент это моя структура тестирования:

tests/app/Exceptions/HandlerTest.php
tests/app/Http/Controllers/BooksControllerTest.php

Тесты для индексации, показа, сохранения, обновления, удаления.Это один из тестов:

public function testStoreBookByPost()
{
    $book = factory('App\Book')->make();

    $this->post(
        '/books',
        [
            'isbn' => $book->isbn,
            'title' => $book->title,
            'description' => $book->description,
            'author' => $book->author,
            'image' => $book->image,
            'price' => $book->price,
            'slug' => $book->slug
        ]
    );

    $this
    ->seeJson(
        [
            'created' => true
        ]
    )
    ->seeInDatabase(
        'books',
        [
            'title' => $book->title
        ]
    );
}

Я ранее разделил тесты обработчика исключений, аналогично я бы предпочел разделить AuthControllerTest на AuthControllerTest.php.

Каков наилучший способ сделать это?

Нужно ли писать тесты авторизации путем рефакторинга всех BooksControllerTest?

Или я должен просто проверить на выдачу токена и невозможность манипулирования базой данных?Это было бы хорошо?

1 Ответ

0 голосов
/ 28 сентября 2018

Краткий ответ: мне нужно было написать тесты авторизации путем рефакторинга всех BooksControllerTest

Длинный ответ: я обнаружил фантастический способ входа в систему фиктивных пользователей во время тестирования.

Счто я создал этот метод.

public function loginWithUserGetJWT()
{
    $user = factory('App\User')->create(
        [
            'password' => bcrypt('366643') // random password
        ]
    );

    $content = $this
    ->post(
        '/auth/login',
        [
            'email' => $user->email,
            'password' => '366643'
        ]
    )
    ->seeStatusCode(200)
    ->response->getContent();

    $token = json_decode($content)->token;

    return $token;
}

И я повторно использую этот метод во всех тестовых случаях, например так:

public function testStoreBookByPost()
{
    $token = $this->loginWithUserGetJWT();

    $book = factory('App\Book')->make();

    $this->post(
        '/books',
        [
            'isbn' => $book->isbn,
            'title' => $book->title,
            'description' => $book->description,
            'author' => $book->author,
            'image' => $book->image,
            'price' => $book->price,
            'slug' => $book->slug,
            'token' => $token
        ]
    );

    $this
    ->seeJson(
        [
            'created' => true
        ]
    )
    ->seeInDatabase(
        'books',
        [
            'title' => $book->title
        ]
    );
}
...