Я настроил только бэкэнд-приложение Laravel из шаблона. Я хочу протестировать контроллеры API с помощью Pest, но постоянно получаю Unresolvable dependency resolving [Parameter #0 [ <required> $request ]] in class Illuminate\Http\Client\Request
.
// UserControllerTest.php
use App\Models\User;
use function Pest\Laravel\{getJson, actingAs};
use Illuminate\Foundation\Testing\RefreshDatabase;
// Necessary to access Laravel testing helpers and database factory stuff
uses(
Tests\TestCase::class,
RefreshDatabase::class
);
// Auto set up a new authed user for each test
beforeEach(function() {
actingAs(User::factory()->create());
});
/**
* Test that the user can be retrieved and api succeeds
*/
it('Test get user succeeds', function () {
// Should get the user from the user controller
$response = getJson('api/user');
// Response should contain a user and be within the 200 range
$response->assertStatus(200);
});
Ниже приведен пользовательский контроллер, который просто возвращает вошедшего в систему пользователя из запроса.
UserController.php
use Illuminate\Http\Client\Request;
public function index(Request $request)
{
// Show the current logged in user
$user = $request->user();
return new UserResource($user);
}
Мой обратный ответ - ошибка сервера 500
Failed asserting that 200 is identical to 500.
The following exception occurred during the last request:
Illuminate\Contracts\Container\BindingResolutionException: Unresolvable dependency resolving [Parameter #0 [ <required> $request ]] in class Illuminate\Http\Client\Request in /home/sites/my-app/vendor/laravel/framework/src/Illuminate/Container/Container.php:1118
Stack trace:
#0 /home/sites/my-app/vendor/laravel/framework/src/Illuminate/Container/Container.php(1027): Illuminate\Container\Container->unresolvablePrimitive(Object(ReflectionParameter))
Кто-нибудь использовал Pestphp для тестирования контроллеров Laravel только с API? Есть ли что-то, что нужно смоделировать, чтобы протестировать маршрут API с помощью PEST?
Эта статья Testing Laravel API with Pest очень похожа по структуре, где они просто используют $response = $this->getJson("/api/posts/{$post->id}");
для получения ответа JSON, однако у них нет такой же проблемы, как у меня.
Маршрут API
Route::group(['middleware' => ['auth:sanctum']], function () {
Route::apiResource('user', UserController::class);
}
// GET|HEAD api/user =>user.index › UserController@index
Дополнительные тесты
Кажется, это связано с отсутствием \Illuminate\Http\Client\Request $request
при вызове `getJson('api/user');
Попытка получить конкретного пользователя, где нет параметра $request
в контроллере, работает.
// This works fine. No error like above.
it('Test get user succeeds', function () {
$user = User::factory()->create();
// Should get the user from the user controller
$response = getJson('api/user/' . $user->id);
// Response should contain a user and be within the 200 range
$response->assertStatus(200);
});
Laravel 9.19
use function Pest\Laravel\{getJson, actingAs};
импортирует вызов getJson, поэтому вам не нужно ссылаться на него с помощью $this
. По сути, это просто помощник в JEST. get
для html-страниц, но мне нужны ответы API, поэтому getJson
.
Оказывается, проблема заключалась в том, что я импортировал неправильный класс Request $request
в свой UserController.
// Wrong Request Class
// use Illuminate\Http\Client\Request;
// Proper Request Class
use Illuminate\Http\Request;
Вот почему так важно всегда публиковать ПОЛНЫЙ код, а не то, чем вы хотите поделиться. Я бы это сразу поймал, поэтому, пожалуйста, в следующий раз поделитесь полным кодом (или хотя бы кодом с проблемой и ЕГЭ)
Я абсолютно ничего не знаю о PEST и думаю, что это не добавляет никакой ценности по сравнению с использованием PHPUnit, но вы можете проверить мой профиль и увидеть несколько ссылок о том, как тестировать и как тестировать контроллеры. Но я вижу, что они используют
$this->get(...)
, почему вы используете функцию с именемgetJson
вместо$this->getJson(...)
?