Тестирование контроллера с помощью PHPUnit, но выдает ошибку 401

Я делаю некоторые тесты с PHPUnit, но у меня есть некоторые проблемы, особенно при тестировании контроллера.

Я хочу проверить маршрут контроллера, просто вызвав маршрут и проверив, является ли ответ HTTP-статусом 200. Но в консоли всегда есть ошибки smae.

Тестирование контроллера с помощью PHPUnit, но выдает ошибку 401 Он говорит что-то об отсутствующем токене. Я понятия не имею, что это за жетон.

Тестирование контроллера с помощью PHPUnit, но выдает ошибку 401

Также это ошибка 401, которую он получает.

Мой PHPUnit-Test выглядит так:

пространство имен App\Tests\Controller;

используйте Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

класс PersonControllerTest расширяет WebTestCase { частный $ клиент;

protected function setUp()
{
    $this->client = static::createClient([], [
        'PHP_AUTH_USER' => 'user',
        'PHP_AUTH_PW'   => 'pass',
    ]);
}


public function testCreate()
{

    $this->client->request('GET','/create');

    $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
}

public function testIndex()
{

    $this->client->request('GET','/');

    $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
}

}

Я пробовал это с аутентификацией в методе setUp -> не сработало.

У вас есть какие-нибудь подсказки?

Спасибо за все ответы и/или комментарии

Трудно придумать решение, не видя большую часть вашего кода, но попробуйте добавить токен в качестве 4-го аргумента в свой request метод, что-то вроде этого $this->client->request ........, ['HTTP_AUTHORIZATION' => 'Bearer Token']). Также, если клиенту требуется HTTPS, вы должны добавить 'HTTPS' => true. Вы используете базовую авторизацию? Если это так, просто удалите PHP_AUTH_USER и другой, а затем используйте Basic your_base_64_token_goes_here вместо Bearer выше.

BentCoder 09.05.2019 10:58

Обычно вы вообще не тестируете контроллеры, по крайней мере, в рамках модульного тестирования. Предполагается, что контроллеры не содержат никакой бизнес-логики и просто служат точками входа в приложение, поэтому вся бизнес-логика должна быть в отдельных классах, которые контроллер просто запускает при вызове. Если у вас есть бизнес-логика в ваших контроллерах, то ваш код демонстрирует антипаттерн под названием Fat Controller.

GordonM 10.05.2019 10:47

@GordonM Он / она не проводит модульное тестирование своего контроллера. Что он/она делает, так это то, что функциональное тестирование является контроллером, который абсолютно действителен - по крайней мере, в том, что касается Symfony.

BentCoder 10.05.2019 16:13
Стоит ли изучать 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 и хотите разрабатывать...
1
3
941
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Базовая авторизация:

   /**
     * @dataProvider urlProvider
     */
    public function testPageIsSuccessful($url)
    {
        $client = self::createClient([], [
            'PHP_AUTH_USER' => getenv('PHP_AUTH_USER'),
            'PHP_AUTH_PW' => getenv('PHP_AUTH_PW')
        ]);
        $client->request('GET', $url);
        $this->assertTrue($client->getResponse()->isSuccessful());
    }

ключ API

    /**
     * @dataProvider urlApiProvider
     */
    public function testAPIWorks($url)
    {
        $accessToken = $this->getAccessToken();
        $tokenQuery = http_build_query(['access_token' => $accessToken]);
        $url .= '?' . $tokenQuery;
        $client = self::createClient([]);
        $client->request('GET', $url, [], [], ['HTTP_ACCEPT' => 'application/json']);

        $this->assertTrue($client->getResponse()->isSuccessful());
    }
Ответ принят как подходящий
protected function setUp()
{
    $this->client = static::createClient();

    $this->logIn();
}

private function logIn()
{
    $session = $this->client->getContainer()->get('session');

    $firewallName = 'test';
    // if you don't define multiple connected firewalls, the context defaults to the firewall name
    // See https://symfony.com/doc/current/reference/configuration/security.html#firewall-context
    $firewallContext = 'test';

    // you may need to use a different token class depending on your application.
    // for example, when using Guard authentication you must instantiate PostAuthenticationGuardToken
    $testUser = new WebserviceUser('[email protected]', ['ROLE_ADMIN'],
        array("employeeid" => array(420),
        "mail" => array("[email protected]")), false);
    $token = new UsernamePasswordToken($testUser, null, $firewallName, ['ROLE_ADMIN']);
    //var_dump($token);
    $session->set('_security_' . $firewallContext, serialize($token));
    $session->save();

    $cookie = new Cookie($session->getName(), $session->getId());
    $this->client->getCookieJar()->set($cookie);
}


public function testCreate()
{

    $crawler = $this->client->request('GET', '/create');
    $this->assertEquals(200, $this->client->getResponse()->getStatusCode());

    $form = $crawler->filter('form')->form([
        'person[name]' => 'Chruit',
        'person[birthdate][month]' => 2,
        'person[birthdate][day]' => 15,
        'person[birthdate][year]' => 2014,
    ]);

    $this->client->submit($form);
}

public function testIndex()
{

    $this->client->request('GET', '/');

    $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
}

}

Решение - это просто функция входа в систему. $testUser должен находиться в вашей Active Directory или в вашей сети. Остальные параметры значения не имеют.

Мой брандмауэр заблокировал его, поэтому я не мог сделать это обычным способом.

Если вы делаете это так, вам нужно добавить что-то в файл secourity.yaml, который был создан при установке PHPUnit.

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