我正在使用 PHPUnit(6.5.8,升级到 7.1.5,没有区别)在使用 Symfony(Flex 1.0)构建的 API 上运行集成测试。
我有几个控制器以一种或另一种方式抛出异常,例如出于安全原因(例如使用@IsGranted注释)。
这些异常通过FOSRestBundle的ExceptionController转换为 JSON 。这工作正常,也在测试中。
我正在通过查看状态代码等来测试正在转换的异常,例如:
public function testSecurity() {
$this->request('GET', '/foo');
$this->assertStatusCode(403);
}
Run Code Online (Sandbox Code Playgroud)
现在,这个测试没有失败,一切正常,但 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
Run Code Online (Sandbox Code Playgroud)
虽然这不会影响测试本身,因为它们仍然成功,但仍然相当麻烦,因为这些消息会干扰测试运行的输出,从而更难发现实际错误发生的位置。因此,我想关闭这些错误消息。IMO,这些异常不应该“未被捕获”,因为它们显然是由某种处理程序处理的,因为它们被转换为 JSON 响应。
我试过的:
error_reporting,SHELL_VERBOSITY,APP_DEBUG等)我注意到的:
这仅在抛出异常时发生(例如,由于使用@IsGranted)。如果我改为返回异常,PHPUnit 不会显示错误。
我有同样的问题。我假设您正在使用 BrowserKit 进行功能测试。
我的解决方法是检查是否AccessDeniedException被抛出,而不是检查状态代码是否为 403。
为了获得异常,我禁用了 BrowserKit 异常捕获器:
public function testSecurity()
{
$this->expectException(AccessDeniedException::class);
$client = static::createClient();
$client->client->catchExceptions(false);
$client->request('GET', '/foo');
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1086 次 |
| 最近记录: |