Как проверить ожидаемые заголовки? - PullRequest
9 голосов
/ 03 февраля 2012

У меня есть модульный тест, который не проходит, потому что заголовки уже отправлены.Тем не менее, заголовок в этом сценарии ожидается.

Как мне сказать PHPUnit ожидать заголовок 500?

Я прочитал этот вопрос , но он не помог.

Методобернут в выходной буфер.

ob_start();
$foo->methodWhichSendsHeader();
ob_clean();

Ответы [ 3 ]

20 голосов
/ 16 июня 2012

Если у вас установлен xdebug, вы можете использовать xdebug_get_headers () для получения заголовков. Затем вы можете проверить их по мере необходимости.

$headers=xdebug_get_headers();

получает массив, который выглядит как ...

array(
    0 => "Content-type: text/html",
    1 => ...
)

Так что вам нужно будет проанализировать каждую строку заголовка, чтобы отделить имя заголовка от значения

2 голосов
/ 17 декабря 2013

Если вы не можете использовать 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.

0 голосов
/ 26 октября 2018

Другой возможный подход - переопределить функцию header php для тестируемого пространства имен. https://www.codepunker.com/blog/overwrite-built-in-php-functions-using-namespaces

namespace My\Application\Namespace;
use My\Test\Application\Namespace;    

//this overrides the header function for that namespace
//it works only if the function is called without the backslash
function header($string){
    HeaderCollector::$headers[] = $string;
}

namespace My\Test\Application\Namespace

/**
 * Class HeaderCollector
 * Using this in combination with function header override
 * for the namespace My\Application\Namespace
 * we can make assertions on headers sent
 */
class HeaderCollector {

    public static $headers = [];

    //call this in your test class setUp so headers array is clean before each test
    public static function clean() {
        self::$headers = [];
    }
}

Тогда в вашем тестовом классе

namespace My\Test\Application\Namespace
use PHPUnit\Framework\TestCase;


class MyTest extends TestCase {

    protected function setUp() {
        parent::setUp();
        //clean for each test
        HeaderCollector::clean();
    }

    public function testHeaders() {
        //call the code that send headers
        ...

        self::assertEquals(
            ["Content-Type: text/html; charset=UTF-8", "Another-Header..."],
            HeaderCollector::$headers
        );
    }
}

Вы можете сохранить свой код в чистоте, и вам не нужен xdebug

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...