Проверьте, вызван ли метод из запроса AJAX или из PhpUnit

Я начал внедрять юнит-тесты в моем текущем проекте.

Хотя все модульные тесты в настоящее время проходят, из-за удобства я внес изменения в 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?

1

Решение

Решил это сам с помощью:

/**
* 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.

0

Другие решения

С моей точки зрения у вас есть два возможных решения:

  1. Установите ключ среды в вашем файле начальной загрузки phpunit и проверьте, существует ли этот ключ сервера
  2. Используйте переменную в вашем классе, которая будет отключена в вашем классе setUp метод

Надеюсь, это поможет

0