Тестирование Laravel Sanctum приводит к неправильному вызову метода

Я пытаюсь протестировать аутентифицированный маршрут API, который только аутентифицированный пользователь может опубликовать на определенном маршруте.

Глядя на документы Laravel Sanctum, я могу использовать приведенный ниже код для создания и аутентификации пользователя:

Sanctum::actingAs(
    factory(User::class)->create(),
    ['*']
);

Когда я пытаюсь воспроизвести это, я получаю сообщение об ошибке при запуске теста

BadMethodCallException: Call to undefined method App\User::withAccessToken()

Мой тестовый код выглядит следующим образом:

    public function an_authenticated_user_can_add_a_client()
    {
        $user = Sanctum::actingAs(
            factory(User::class)->create(),
            ['*']
        );
        dd($user);
        // $this->post('/api/clients', $this->data());
    }

API.php

Route::middleware('auth:sanctum')->group(function () {

    //Clients
    Route::get('/clients/{client}','ContactsController@show');
    Route::post('/clients','ContactsController@store');
    Route::patch('/clients/{client}','ContactsController@update');
    Route::delete('/clients/{client}','ContactsController@destroy');
});

У меня нет метода withAccessToken() в моем классе User, и я не вижу, откуда берется этот метод или где он указан. Любая помощь будет принята с благодарностью.


person basic    schedule 11.04.2020    source источник


Ответы (2)


В вашей модели пользователя отсутствует черта HasApiTokens, которая дает отсутствующую функцию модели пользователя. Также описано в документации в разделе "Выдача токенов API".

use Laravel\Sanctum\HasApiTokens;

class User {
    use HasApiTokens;
}
person mrhn    schedule 11.04.2020
comment
Я вижу, это сработало отлично, спасибо. Хотя я заметил, что в документации упоминается, что токены API не должны использоваться в стороннем SPA (которое я создаю SPA), извините за отсутствие опыта, хочу ли я выпустить токен API в моем случае тестирования, чтобы увидеть, может ли аутентифицированный пользователь добавлять данные в базу данных? Как я понимаю, аутентификация SPA - это просто захват csrf-cookie вместо токена? - person basic; 11.04.2020
comment
См. ответ Хавьера, если вы используете аутентификацию SPA - person PW_Parsons; 06.05.2020

Laravel Sanctum для SPA использует обычную аутентификацию сеанса, поэтому метод по умолчанию, действующий как работает нормально. Метод actAs в Sanctum предназначен для использования с токенами API. Надеюсь, поможет.

person Javier Estupinan    schedule 16.04.2020