繁体   English   中英

Laravel phpunit 测试授权失败

[英]Laravel phpunit test failing authorization

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

我需要写一个测试决定使用laravel的phpunit测试。 这个简单的应用程序只允许经过身份验证的用户可以storeupdatedeletebook 其他所有人(无论是否经过身份验证)都可以检索所有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期间使用,但我不确定并且真的需要帮助才能正确设置。

您可以在json()方法的第四个参数中发送标头,如下所示:

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

由于json方法本身具有传递标头的条件

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

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

尝试这样,希望可以解决您的问题

不确定身份验证是如何挂在您的应用程序上的,但是您可以尝试这样做:

...

$this->actingAs($user)
    ->jsonPost('/api/books', [
        // ...  
    ]);

$response->assertStatus(201);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM