У меня проблема с модульным тестированием 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
да после того, как $ user-> createToken () не работает
Хорошо, так что происходит? Отладьте его или предоставьте трассировку стека. «Не работает» не очень полезно.
Что делает createToken? Обращается ли он к серверу, есть ли у него доступ к серверу? Вы получаете сообщение на сервере?
он должен создать токен в db для аутентификации






Я предполагаю, что маршрут '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');.
не могли бы вы поставить определение маршрута api/register?
он вызывает метод register (), а метод register вызывает зарегистрированный ()
У меня есть такие вещи, но $ user-> createToken () возвращает 500, почему это может быть с почтальоном в порядке, но с модульным тестированием не в порядке? Спасибо за ваш ответ
поставьте пожалуйста метод createToken('WAI')
публичная функция createToken ($ name, array $ scopes = []) {return Container :: getInstance () -> make (PersonalAccessTokenFactory :: class) -> make ($ this-> getKey (), $ name, $ scopes); }
Вы используете Laravel Passport?
Попробуйте использовать $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; } `-
это 81 строка: return PersonalAccessClient :: orderBy ('id', 'desc') -> first () -> client;
В моей таблице db oauth_personal_access_clients у меня есть одна запись с идентификатором 1
client - это отношения? Если это так, вы должны вызывать его в круглых скобках: client() - отношения - это функции внутри модели.
эта функция находится в папке vendor, написана не мной
Вы отладили, что на самом деле дает сбой? Это тело запроса, URI, сам сервер испортил? и т. д. и т. д.