PHPUnit: не сообщать об исключениях Symfony, отображаемых с ошибками HTTP - PullRequest
0 голосов
/ 21 мая 2018

Я запускаю интеграционные тесты с PHPUnit (6.5.8, обновлен до 7.1.5, без разницы) на API, созданном с Symfony (Flex 1.0).

У меня есть несколько контроллеров, которые выдают исключения одним способомили другой, например, из соображений безопасности (например, с использованием аннотации @IsGranted).

Эти исключения преобразуются в JSON через ExceptionController из FOSRestBundle .Это отлично работает, также в тестах .

Я тестирую те исключения, которые конвертируются, проверяя коды состояния и т. Д., Пример:

public function testSecurity() {
    $this->request('GET', '/foo');
    $this->assertStatusCode(403);
}

Теперь этоtest не завершается неудачей и все работает как надо, но PHPUnit по-прежнему отображает следующие типы ошибок:

[error] Uncaught PHP Exception Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException: "Access Denied by controller annotation @IsGranted("ROLE_ADMIN")" at /var/www/symfony/vendor/symfony/security/Http/Firewall/ExceptionListener.php line 117

Хотя это не влияет на сами тесты, так как онивсе еще успешны, это все еще довольно беспокоит, поскольку эти сообщения нарушают вывод теста, затрудняя выявление фактических ошибок.Ergo, я хотел бы отключить эти сообщения об ошибках.ИМО, эти исключения не должны быть «необработанными», так как они, очевидно, обрабатываются каким-то обработчиком, поскольку они преобразованы в ответ JSON.

Что я пробовал:

  • отключение регистрации ошибок, как упомянуто в этой проблеме , описывающей в точности поведение, которое я наблюдаю
  • , утверждающее выброшенное Исключение в PHPUnit, но это не удается, так как Исключение фактически не являетсябросил в тесте
  • различные настройки PHPUnit (error_reporting, SHELL_VERBOSITY, APP_DEBUG и т. д.)

Что я заметил:

Этопроисходит только тогда, когда выдается исключение (например, из-за использования @IsGranted).Если вместо этого я верну исключение, PHPUnit не выдаст ошибку.

1 Ответ

0 голосов
/ 22 мая 2018

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

Мой обходной путь состоял в том, чтобы проверить, что было выброшено AccessDeniedException, вместо проверки того, что код состояния был 403.

Чтобы получитьисключение, я отключил ловушку исключений BrowserKit:

public function testSecurity()
{
    $this->expectException(AccessDeniedException::class);

    $client = static::createClient();
    $client->client->catchExceptions(false);

    $client->request('GET', '/foo');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...