Laravel phpunit test не проходит авторизацию - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть работающее приложение api.

Мне необходимо написать тест, который решил использовать тест phpunit laravel.Это простое приложение позволяет только аутентифицированным пользователи могут 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, но я не уверен и действительно нуждаюсь в помощи, чтобы понять это правильно.

1 Ответ

0 голосов
/ 28 сентября 2018

вы можете отправлять заголовки в четвертых параметрах метода 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"]);

Попробуйте вместо этого надеяться, что это решит ваши проблемы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...