Как протестировать контроллеры Laravel Api (только) с помощью тестирования PEST Php?

Я настроил только бэкэнд-приложение 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

Я абсолютно ничего не знаю о PEST и думаю, что это не добавляет никакой ценности по сравнению с использованием PHPUnit, но вы можете проверить мой профиль и увидеть несколько ссылок о том, как тестировать и как тестировать контроллеры. Но я вижу, что они используют $this->get(...), почему вы используете функцию с именем getJson вместо $this->getJson(...)?

matiaslauriti 14.02.2023 04:30
use function Pest\Laravel\{getJson, actingAs}; импортирует вызов getJson, поэтому вам не нужно ссылаться на него с помощью $this. По сути, это просто помощник в JEST. get для html-страниц, но мне нужны ответы API, поэтому getJson.
wanna_coder101 14.02.2023 06:02
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Оказывается, проблема заключалась в том, что я импортировал неправильный класс Request $request в свой UserController.

// Wrong Request Class
// use Illuminate\Http\Client\Request;

// Proper Request Class
use Illuminate\Http\Request;

Вот почему так важно всегда публиковать ПОЛНЫЙ код, а не то, чем вы хотите поделиться. Я бы это сразу поймал, поэтому, пожалуйста, в следующий раз поделитесь полным кодом (или хотя бы кодом с проблемой и ЕГЭ)

matiaslauriti 14.02.2023 19:08

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