Как выполнить модульный тест для бэкэнд-контроллера

Я хочу проверить, правильно ли работают мои серверные контроллеры с помощью модульных тестов, поэтому мне не нужно вручную проверять их при изменении вещей.

К сожалению, на все, что я пробую, я не нашел 404.

Мой phpunit.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<phpunit backupGlobals = "false"
         backupStaticAttributes = "false"
         bootstrap = "../../../tests/bootstrap.php"
         colors = "true"
         convertErrorsToExceptions = "true"
         convertNoticesToExceptions = "true"
         convertWarningsToExceptions = "true"
         processIsolation = "false"
         stopOnFailure = "false"
         syntaxCheck = "false"
>
    <testsuites>
        <testsuite name = "ExitControl.Administration test suite">
            <directory>./tests</directory>
        </testsuite>
    </testsuites>
    <php>
        <env name = "APP_ENV" value = "testing"/>
        <env name = "CACHE_DRIVER" value = "array"/>
        <env name = "SESSION_DRIVER" value = "array"/>
    </php>
</phpunit>

Тест, в котором я пытаюсь получить доступ к URL-адресу серверной части

public function setUp() 
{
    parent::setup();

    $user = User::create([
        'email' => '[email protected]',
        'login' => 'tester',
        'password' => 'test',
        'password_confirmation' => 'test',
        'send_invite' => false,
        'is_activated' => true,            
    ]);

    $user->is_superuser = true;
    $user->save();

    $user = BackendAuth::authenticate([
        'login' => 'tester',
        'password' => 'test'
    ], true);
}

public function testCreateIndexView()
{

    $controller = $this->getController();

    $configUrl = config('app.url') . '/' . 
                 config('cms.backendUri') . '/';

    $url = preg_replace('/([^:])(/{2,})/', '$1/', 
            $configUrl . 
            str_replace(['controllers\\', '\\'], ['', '/'], 
            strtolower(get_class($controller))));

    $result = $this->get($url);

    dd($result);// shows a 404
}

Вывод dd ();

PHPUnit 5.7.27 by Sebastian Bergmann and contributors.

CreateExitcontrolAdministrationCompaniesTable > dropping table exitcontrol_administration_companies
CreateExitcontrolAdministrationCompaniesTable > creating table exitcontrol_administration_companies
Illuminate\Foundation\Testing\TestResponse {#55
  +baseResponse: Illuminate\Http\Response {#1696
    +headers: Symfony\Component\HttpFoundation\ResponseHeaderBag {#1695
      #computedCacheControl: array:2 [
        "no-cache" => true
        "private" => true
      ]
      #cookies: array:1 [
        "" => array:1 [
          "/" => array:2 [
            "october_session" => Symfony\Component\HttpFoundation\Cookie {#1073
              #name: "october_session"
              #value: "eyJpdiI6Imh1SHlCUkhcL29rMlk2dFBkZTRNWlpnPT0iLCJ2YWx1ZSI6IjFJamxxRW9aQkM5bk9kM2VnMExLUTdVNER0MzlcL2xacFdkMCs0dTdXR1N0NVwva01KaTVwbnhVUVI2S0Q2MmRJaldWdEtyRldBcmNkc2dWMnhrVTJoZ3c9PSIsIm1hYyI6IjUyYTJiYWRlNDUzYTFjZjRhMDVhNzliMzJjNGVhZTBjNWViMDlmNTJkMWM3NjhlZGE4NTRjYjhiY2U3M2EzNmUifQ= = "
              #domain: null
              #expire: 1537286593
              #path: "/"
              #secure: false
              #httpOnly: true
              -raw: false
              -sameSite: null
            }
            "admin_auth" => Symfony\Component\HttpFoundation\Cookie {#1072
              #name: "admin_auth"
              #value: "eyJpdiI6InVWM1pFNExzMytCMzZQWEJISTJoOFE9PSIsInZhbHVlIjoiU1l2NitIUDNFd3JVeHdhenh2alV5YWxtMW1vYTFsbUhweDlJd3RcL2xDQnQyY3cwMVAzOFNDQjdrQXNZS1JFUmV4U2FVWG5XV0g3d0VOYStIR2hxV25nMDNlc1wvdStma2hkYlZTV01vemg0R1FpXC80ZWQ5YjMwcjdPSW9aRnJzS1MiLCJtYWMiOiJiYWFjODE2NTBjOGQ0NjkwNmJlYzVjZjFhOTJjMjdmYzBkMTA2MDEzNTM0MTljMmE2Njc1Njc0NTlmMGQ5ZWY4In0 = "
              #domain: null
              #expire: 1694959389
              #path: "/"
              #secure: false
              #httpOnly: true
              -raw: false
              -sameSite: null
            }
          ]
        ]
      ]
      #headerNames: array:4 [
        "cache-control" => "Cache-Control"
        "date" => "Date"
        "content-type" => "Content-Type"
        "set-cookie" => "Set-Cookie"
      ]
      #headers: array:3 [
        "cache-control" => array:1 [
          0 => "no-cache, private"
        ]
        "date" => array:1 [
          0 => "Tue, 18 Sep 2018 14:03:13 GMT"
        ]
        "content-type" => array:1 [
          0 => "text/html; charset=UTF-8"
        ]
      ]
      #cacheControl: []
    }
    #content: "

Page not found

" #version: "1.1" #statusCode: 404 #statusText: "Not Found" #charset: null +original: "

Page not found

" +exception: null } }

Я также пробовал вызывать контроллеры напрямую, но многие значения, которые заполняются обычными запросами, пусты в BackendController.

Что мне нужно изменить, настроить, чтобы иметь возможность тестировать мои внутренние контроллеры?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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 и хотите разрабатывать...
2
0
371
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Чтобы протестировать ваш контроллер, если он будет работать, вам нужно установить контекст выполнения на бэкэнд и запустить поставщика серверных услуг.

Даже в этом случае вам необходимо настроить тестового пользователя администратора для базы данных в памяти, которую вы можете использовать, потому что в противном случае контроллер попытается перенаправить вас на страницу входа.

use BackendAuth;
use PluginTestCase;
use Backend\Models\User;
use Backend\Classes\Controller;
use MyAuthor\MyPlugin\Controllers\MyController;

class BasicBackendControllerTest extends PluginTestCase
{

    public function setUp() 
    {
        parent::setup();

        $user = User::create([
            'email' => '[email protected]',
            'login' => 'tester',
            'password' => 'test',
            'password_confirmation' => 'test',
            'send_invite' => false,
            'is_activated' => true,            
        ]);

        $user->is_superuser = true;
        $user->save();

        $user = BackendAuth::authenticate([
            'login' => 'tester',
            'password' => 'test'
        ], true);
    }

    public function testCreateIndexView()
    {
        // default this will be at front-end. This needs to be set to 
        // back-end so the service provider we will load will load up 
        // the backend settings.
        app()->setExecutionContext('back-end');

        // registering and running the service provider
        $provider = app()->register('\Backend\ServiceProvider');
        $provider->boot();

        // the magic happens here that allows a controller to be run.
        $provider->register();

        // retrieve the controller instance from child class
        $controller = new MyController();

        $result = $controller->run('index');

        $this->assertEquals(200, $result->status());
    }
}

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