我有一个有效的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
中使用,但是我不确定,确实需要帮助以使其正确。
答案 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"]);
尝试此方法,希望能解决您的问题