流明5.4:PHPUnit:如何测试授权?

时间:2018-09-22 13:38:02

标签: php unit-testing tdd lumen

我正在从事一个电子商务项目,一家普通的书店。

我从“测试驱动”方法开始,直到现在我都完全坚持。

此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 :(得分:0)

简短的回答:我需要通过重构所有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
        ]
    );
}