![](/img/trans.png)
[英]PHPUnit Test Failing - 'PHPUnit\Framework\Assert' not found
[英]Laravel phpunit test failing authorization
我有一个有效的api
应用程序。
我需要写一个测试决定使用laravel
的phpunit测试。 这个简单的应用程序只允许经过身份验证的用户可以store
、 update
或delete
一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
期间使用,但我不确定并且真的需要帮助才能正确设置。
您可以在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.