Как проверить ожидаемые заголовки?

У меня есть 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.