Laravel PHPUnit测试失败授权

时间:2018-09-28 07:27:58

标签: php laravel laravel-5.6

我有一个有效的api应用程序。

我需要编写一个决定使用laravel的phpunit测试的测试。这个简单的应用程序仅允许经过认证的用户可以storeupdatedelete book。其他所有人(无论是否通过身份验证)都可以检索所有books的列表或查看其中一个book的详细信息。

对于我的books测试,我编写了一个测试,该测试首先为用户创建一个user,然后创建一个随机的token。然后在发布新书记录时使用withHeaders传递令牌

class BooksTest extends TestCase
{
    public function test_onlyAuthenticatedUserCanAddBookSuccessfully()
    {
        $user = factory(User::class)->create();
        $token = str_random(10);
        $book = factory(Book::class)->create();

        $response = $this->withHeaders(['Authorization' => "Bearer $token"])
            ->json('POST', '/api/books', [
                'title' => 'book post',
                'author' => 'post author'
            ]);

        $response->assertStatus(201);
    }
}

我在这里使用默认的Laravel 5.6 UserFactory和我自己的BookFactory

$factory->define(Book::class, function (Faker $faker) {
    return [
        'title'     => $faker->sentence,
        'author'    => $faker->name,
        'user_id'   => 1
    ];
});

$factory->define(Rating::class, function (Faker $faker) {
    return [
        'user_id'   => 1,
        'book_id'   => mt_rand(1, 2),
        'rating'   => mt_rand(1, 5)
    ];
});

运行测试时,测试失败,并且我得到401而不是200,这意味着用户未经授权。

我觉得我可能没有正确设置测试中的$user以在POST中使用,但是我不确定,确实需要帮助以使其正确。

1 个答案:

答案 0 :(得分:0)

您可以将json()方法的第四个参数中的标头发送为

<?php
if($_GET["name"]||$_GET["age"])
{
    echo "welcome ".$_GET["name"]."<br/>";
    echo "You are ".$_GET["age"]."Years old";
}
?>
<html>  
<body>
<form action="<?php $_PHP_SELF ?>" method="GET">
Name : <input type="text" name="name"/>
Age : <input type="text" name="age"/>
<input type="submit" />
</form>
</body>
</html> 

因为json方法本身可以传递标头

或者您可以将post()方法用作

$response = $this->json('POST', '/api/books', [
            'title' => 'book post',
            'author' => 'post author'
        ],['Authorization' => "Bearer $token"]);

尝试此方法,希望能解决您的问题