私は、すべての例外がエラー ハンドラーによってキャッチされ、RESTFul API に適した適切な JSON エラー応答で返される内部フレームワークを使用しています。
次に、一連のテスト (API テスト) を用意しました。主に、API が予想されるエラー コードを含む適切な JSON 応答を返すことをテストします。
すべてのテストで、グローバル変数が変更 (および復元) され、異なる HTTP 要求がエミュレートされます。(Guzzle などを使用して) cURL テストを実行することによる過負荷を回避するために、そのようにしています。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 エラー ハンドラを無効にしようとしましたが、うまくいきませんでした。
この場合、どうすればよいですか?ありがとう