PHPUnit:不报告呈现给HTTP错误的Symfony异常

时间:2018-05-21 20:23:37

标签: symfony phpunit

我在使用Symfony(Flex 1.0)构建的API上运行与PHPUnit(6.5.8,升级到7.1.5,没有区别)的集成测试。

我有几个控制器以某种方式抛出异常,例如出于安全原因(例如使用@IsGranted注释)。

这些异常通过ExceptionController of the FOSRestBundle转换为JSON。这样做很好,也在测试中

我正在测试通过查看状态代码等转换的异常,例如:

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

现在,此测试不会失败并且一切正常,但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

虽然这不会影响测试本身,因为它们仍然成功,但仍然相当困扰,因为这些消息会破坏测试运行的输出,使得更难发现实际错误发生的位置。问题,我想关闭这些错误消息。 IMO,这些异常不应该“未被捕获”,因为它们显然是由某种处理程序处理的,因为它们被转换为JSON响应。

我尝试了什么:

  • 关闭错误记录,如this issue中所述,描述了我正在看到的行为
  • 在PHPUnit中断言抛出异常,但由于在测试中实际上没有抛出异常,因此失败
  • 各种PHPUnit设置(error_reportingSHELL_VERBOSITYAPP_DEBUG等)

我注意到了什么:

这仅在抛出异常时发生(例如由于使用@IsGranted)。如果我返回异常,PHPUnit不会显示错误。

1 个答案:

答案 0 :(得分:4)

我遇到了同样的问题。我假设您正在使用BrowserKit进行功能测试。

我的解决方法是检查是否抛出AccessDeniedException而不是检查状态代码是否为403。

为了获得异常,我禁用了BrowserKit异常捕获器:

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

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

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