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



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

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

这些异常通过 FOSRestBundle 的 ExceptionController 转换为 JSON。这在测试中也工作正常。

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

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

现在,此测试不会失败,并且一切正常,但 PHPUnit 仍显示以下类型的错误:

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

虽然这不会影响测试本身,因为它们仍然成功,但它仍然相当麻烦,因为这些消息会中断测试运行的输出,从而更难发现实际错误发生的位置。因此,我想关闭这些错误消息。IMO,这些异常不应该被"取消捕获",因为它们显然是由某种处理程序处理的,因为它们被转换为 JSON 响应。

我尝试过:

  • 关闭错误日志记录,如此问题中所述,准确描述我所看到的行为
  • PHPUnit 中断言抛出的异常,但这失败了,因为异常实际上并未在测试中抛出
  • 各种PHPUnit设置(error_reportingSHELL_VERBOSITYAPP_DEBUG等(

我注意到的:

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

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

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

为了获得异常,我禁用了浏览器工具包异常捕获器:

public function testSecurity()
{
$this->expectException(AccessDeniedException::class);
$client = static::createClient();
$client->client->catchExceptions(false);
$client->request('GET', '/foo');
}

相关内容

最新更新