Как проверить ожидаемые заголовки?
У меня есть unit test, потому что заголовки уже отправлены. Тем не менее ожидается заголовок в этом сценарии.
Как мне сказать PHPUnit ожидать 500 заголовков?
Я прочитал этот вопрос, но это не помогло.
Метод обернут внутри выходного буфера.
ob_start();
$foo->methodWhichSendsHeader();
ob_clean();
Ответы
Ответ 1
Если у вас установлен xdebug, вы можете использовать xdebug_get_headers(), чтобы получить заголовки. Затем вы можете протестировать их по мере необходимости.
$headers=xdebug_get_headers();
получает массив, который выглядит как...
array(
0 => "Content-type: text/html",
1 => ...
)
Итак, вам нужно проанализировать каждую строку заголовка, чтобы отделить имя заголовка от значения
Ответ 2
Если вы не можете использовать xdebug_get_headers в своей системе, другой подход состоит в том, чтобы высмеять функцию заголовка.
Теперь я использую следующее, что отлично работает. Допустим, у вас есть этот код...
<?php
header('Content-type: text/plain; charset=UTF-8');
...
Я заменяю header
на функцию заголовка, которая может быть проверена следующим образом:
<?php
Testable::header('Content-type: text/plain; charset=UTF-8');
...
Класс Testable выполняется следующим образом. Обратите внимание, что функции просто должны быть добавлены с помощью Testable::
. В противном случае они работают так же, как обычные функции.
class Testable {
private static $headers=array();
static function header($header) {
if (defined('UNIT_TESTING')) {
self::$headers[]=$header;
} else {
header($header);
}
}
public static function reset() {
self::$headers=array();
}
public static function headers_list() {
if (defined('UNIT_TESTING')) {
return self::$headers;
} else {
return headers_list();
}
}
}
Теперь все, что вам нужно сделать, это определить UNIT_TESTING
в ваших тестах, но не в производстве. Затем, когда вы придете проверить ваши заголовки, просто позвоните Testable::headers_list()
.
Конечно, вы должны добавить методы для setcookie, headers_sent и любых других функций, которые вызывают заголовки HTTP.