Я начал внедрять юнит-тесты в моем текущем проекте.
Хотя все модульные тесты в настоящее время проходят, из-за удобства я внес изменения в jsonResponse
способ также отправлять заголовки JSON. Это помогает мне увидеть ответ json как дерево в консоли Chrome.
Теперь модульные тесты не проходят из-за
Невозможно изменить информацию заголовка — заголовки уже отправлены
(вывод начался с [fullPath] /phpunit/src/Util/Printer.php:134)
Копая глубже, я обнаружил, что это можно исправить, добавив @runInSeparateProcess
в докблоках.
Но это только приводит к:
Неустранимая ошибка PHP: класс ‘PHPUnit_Util_Configuration’ не найден в строке 365
Трассировка стека PHP:
PHP 1. {main} () -: 0
Это один из моих методов json (он вызывается в конце нескольких методов, которые вызываются через запросы AJAX):
/**
* Helper function to print a json encoded success message back to the frontend.
*
* @param array $returnData
*
* @return bool
*
* @runInSeparateProcess
*/
public function returnJsonSuccess($returnData = [])
{
header('Content-Type: application/json');
echo json_encode(
[
"success" => true,
"data" => $returnData,
]
);
return true;
}
Итак, переходя к погоне, как я могу заставить это работать должным образом?
Один из моих вариантов — определить, вызван ли метод из модульного теста, и условно отправить заголовки, только если он вызван нормально. Я думаю, что самый простой способ — это определить переменную среды или константу в файле начальной загрузки и проверить это в моем BaseController
,
Есть ли более чистый способ заставить мои модульные тесты работать снова, при этом сохраняя отправленные заголовки json?
Решил это сам с помощью:
/**
* Helper function to print a json encoded success message back to extJs.
*
* @param array $returnData
*
* @return bool
*/
public function returnJsonSuccess($returnData = [])
{
$request = $this->getRequest();
if ($request && $request->isXmlHttpRequest()) {
header('Content-Type: application/json');
}
echo json_encode(
[
"success" => true,
"data" => $returnData,
]
);
return true;
}
ZendFramework, используя Request
класс, может обнаружить, если вызов сделан из запроса AJAX или нет. Таким образом, я отправляю заголовки только при наличии запроса AJAX.
С моей точки зрения у вас есть два возможных решения:
setUp
методНадеюсь, это поможет