我正在使用內部框架,每個異常都由錯誤處理程序捕獲並返回適當的JSON錯誤響應,適用於RESTFul API。如何讓PHPUnit停止攔截異常?
然後我有一套測試,這是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錯誤處理程序,但沒有運氣。
我能在這種情況下做什麼?謝謝
只需注意,你引用的大部分代碼看起來應該可能在phpUnit測試類的'setup()'函數中。另外請注意,phpUnit具有內置的功能,可在每次測試後將全局恢復爲原始狀態。你可能想要利用它而不是重新發明輪子。 – Simba
這段代碼只是一個例子,但是PHPunit做全局備份的確是這樣。 – itsjavi
@mjolnic您好,我在這裏遇到了完全相同的問題。你有沒有找到合適的解決方案? – dKen