我正在使用一个内部框架,其中每个异常都由错误处理程序捕获并以适当的 JSON 错误响应返回,适用于 RESTFul API。
然后我有一套测试,它们是 API 测试,主要是测试 API 返回正确的 JSON 响应和预期的错误代码。
对于每个测试,都会修改(然后恢复)全局变量以模拟不同的 HTTP 请求。我这样做是为了避免进行 cURL 测试(通过 Guzzle 或类似方法)的过载,并导致在 CLI 环境下,代码不知道服务器的 url。
<?php
// ... example, part of a base ApiTestCase class:
// Override globals (should be backed up by PHPUnit)
$_SERVER['REQUEST_METHOD'] = $request->method;
$_SERVER['QUERY_STRING'] = http_build_query($request->parameters);
$_SERVER['PATH_INFO'] = $request->path;
$_SERVER['REQUEST_URI'] = $request->path . ($_SERVER['QUERY_STRING'] ? '?' : '') . $_SERVER['QUERY_STRING'];
$_SERVER['REQUEST_TIME'] = time();
$_SERVER['REQUEST_TIME_FLOAT'] = microtime(true);
$_SERVER['HTTP_COOKIE'] = '';
// Set headers, cookies and parameters
foreach ($request->headers as $k => $v) {
$_SERVER['HTTP_' . strtoupper(str_replace('-', '_', trim($k)))] = $v;
}
if ($_SERVER['HTTP_COOKIE']) {
$GLOBALS['_COOKIE'] = http_parse_cookie($_SERVER['HTTP_COOKIE']);
} else {
$GLOBALS['_COOKIE'] = [];
}
$GLOBALS['_REQUEST'] = $request->parameters;
$responseBody = $app->start();
$response->httpCode = http_response_code();
$response->body = $responseBody ? @json_decode($responseBody) : null;
$response->headers = headers_list();
(我知道以这种方式更改全局变量并不好,框架不应该直接依赖全局变量,但我仍然需要处理遗留代码。)
那么问题来了:当我尝试测试 JSON 错误响应时:PHPUnit 拦截了抛出的异常(在我开头提到的处理程序之前),因此框架没有机会将其转换为 JSON 并返回正确的响应。
我试图在 PHPUnit 手册中找到一些东西来禁用 PHPUnit 错误处理程序,但没有成功。
在这种情况下我能做什么?谢谢