Модульное тестирование Laravel 5.5 api

У меня проблема с модульным тестированием laravel api, это мои конфигурации и простой код, но я получаю «Ожидаемый код состояния 201, но получил 500». А с почтальоном все нормально, почему ??? помогите пожалуйста config1config2контрольная работаконтролеррезультат

В RegisterController есть черта, называемая RegistersUsers, и в ней есть метод register ()

Route::post('register', 'Auth\RegisterController@register');

он вызывает метод register (), а метод register вызывает зарегистрированный ()

конфигурация 1 - config / database.php

   'connections' => [

    'sqlite' => [
        'driver' => 'sqlite',
        'database' => ':memory:',
        'prefix' => '',
    ],

конфигурация 2 - phpunit.xml

   <php>
    <env name = "APP_ENV" value = "testing"/>
    <env name = "CACHE_DRIVER" value = "array"/>
    <env name = "SESSION_DRIVER" value = "array"/>
    <env name = "QUEUE_DRIVER" value = "sync"/>
    <env name = "DB_CONNECTION" value = "sqlite"/>
</php>

контрольная работа

public function testRegisterSuccessfully()
{
    $register = [
        'name' => 'UserTest',
        'email' => '[email protected]',
        'password' => 'testpass',
        'password_confirmation' => 'testpass'
    ];

    $this->json('POST', 'api/register', $register)
        ->assertStatus(201)
        ->assertJsonStructure([
            'token',
            'user' => [
                'id',
                'name',
                'email',
                'created_at',
                'updated_at'
            ]
        ]);
 }

метод контроллера

public function registered(Request $request)
{
    $user = $this->guard()->user();
    $success['token'] = $user->createToken('WAI')->accessToken;
    $success['user'] = $user;
    return response()->json($success, 201);
}

результат

 developer@developer-v3:/var/www/WAI$ composer test
 > vendor/bin/phpunit
 PHPUnit 6.5.8 by Sebastian Bergmann and contributors.

  ..F..                                                               5 /   5 (100%)

Time: 3.78 seconds, Memory: 20.00MB

 There was 1 failure:

1) Tests\Feature\Auth\RegisterControllerTest::testRegisterSuccessfully
Expected status code 201 but received 500.
Failed asserting that false is true.

/var/www/WAI/vendor/laravel/framework/src/Illuminate/Foundation/Testing         /TestResponse.php:78
/var/www/WAI/tests/Feature/Auth/RegisterControllerTest.php:26

FAILURES!
Tests: 5, Assertions: 6, Failures: 1.
Script vendor/bin/phpunit handling the test event returned with error code   1

Вы отладили, что на самом деле дает сбой? Это тело запроса, URI, сам сервер испортил? и т. д. и т. д.

Loek 07.05.2018 13:27

да после того, как $ user-> createToken () не работает

Anyuta 07.05.2018 13:32

Хорошо, так что происходит? Отладьте его или предоставьте трассировку стека. «Не работает» не очень полезно.

Loek 07.05.2018 13:35

Что делает createToken? Обращается ли он к серверу, есть ли у него доступ к серверу? Вы получаете сообщение на сервере?

Ron Nabuurs 07.05.2018 13:36

он должен создать токен в db для аутентификации

Anyuta 07.05.2018 14:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
5
1 034
3

Ответы 3

Я предполагаю, что маршрут 'api/register' связан с методом registered.

Вы отправляете переменную $register с данные пользователя, но не используете ее.

Попробуйте:

В тесте

public function testRegisterSuccessfully()
{
    $register = [
        'name' => 'UserTest',
        'email' => '[email protected]',
        'password' => 'testpass',
        'password_confirmation' => 'testpass'
    ];

    $this->json('POST', 'api/register', $register)
        ->assertStatus(201)
        ->assertJsonStructure([
            'token',
            'user' => [
                'id',
                'name',
                'email',
                'created_at',
                'updated_at'
            ]
        ]);
 }

В контроллере

public function register(Request $request)
{
    $user = User::create($request->all());
    $success = $this->registered($user);

    return response()->json($success, 201);
}

public function registered($user)
{
    $success['token'] = $user->createToken('WAI')->accessToken;
    $success['user'] = $user;
    return $success;
}

ВАЖНЫЙ
Если вы используете Laravel Passport, не забудьте реализовать в модели свойство HasApiTokens.

Модель пользователя

use Laravel\Passport\HasApiTokens;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use HasApiTokens, Notifiable;

Нет, я использую пользовательские данные. В RegisterController есть черта, называемая RegistersUsers, и в ней есть метод register () Route::post('register', 'Auth\RegisterController@register');.

Anyuta 07.05.2018 15:26

не могли бы вы поставить определение маршрута api/register?

Maru Amallo 07.05.2018 15:39

он вызывает метод register (), а метод register вызывает зарегистрированный ()

Anyuta 07.05.2018 15:43

У меня есть такие вещи, но $ user-> createToken () возвращает 500, почему это может быть с почтальоном в порядке, но с модульным тестированием не в порядке? Спасибо за ваш ответ

Anyuta 07.05.2018 16:02

поставьте пожалуйста метод createToken('WAI')

Maru Amallo 07.05.2018 16:12

публичная функция createToken ($ name, array $ scopes = []) {return Container :: getInstance () -> make (PersonalAccessTokenFactory :: class) -> make ($ this-> getKey (), $ name, $ scopes); }

Anyuta 07.05.2018 16:26

Вы используете Laravel Passport?

Maru Amallo 07.05.2018 16:31

Попробуйте использовать $this->withoutExceptionHandling() в начале вашего теста. Это помешает Laravel разрешить исключение в код состояния HTTP и предложит вам более подробное объяснение ошибки.

Большое спасибо, теперь можно увидеть ErrorException: попытка получить свойство не-объекта /var/www/WAI/vendor/laravel/passport/src/ClientRepository.ph‌ p: 81 и мой ClientRepository.php: 81 - это эта функция ` / ** * Получение клиента токена персонального доступа для приложения. * @return \ Laravel \ Passport \ Client * / общедоступная функция personalAccessClient () {if (Passport :: $ personalAccessClient) {return $ this-> find (Passport :: $ personalAccessClient); } return PersonalAccessClient :: orderBy ('id', 'desc') -> first () -> client; } `-

Anyuta 07.05.2018 21:27

это 81 строка: return PersonalAccessClient :: orderBy ('id', 'desc') -> first () -> client;

Anyuta 07.05.2018 21:28

В моей таблице db oauth_personal_access_clients у меня есть одна запись с идентификатором 1

Anyuta 07.05.2018 21:33

client - это отношения? Если это так, вы должны вызывать его в круглых скобках: client() - отношения - это функции внутри модели.

эта функция находится в папке vendor, написана не мной

Anyuta 07.05.2018 21:41

Другие вопросы по теме