Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Phpunit 如何测试预期的标题?_Phpunit - Fatal编程技术网

Phpunit 如何测试预期的标题?

Phpunit 如何测试预期的标题?,phpunit,Phpunit,我有一个单元测试失败,因为已经发送了头。但是,此场景中的头是预期的 我如何告诉PHPUnit期望500头球 我读过,但没用 该方法被包装在输出缓冲区中 ob_start(); $foo->methodWhichSendsHeader(); ob_clean(); 如果安装了xdebug,则可以使用xdebug\u get\u headers()获取头。然后您可以根据需要测试它们 $headers=xdebug_get_headers(); 获取一个数组,该数组看起来像 array(

我有一个单元测试失败,因为已经发送了头。但是,此场景中的头是预期的

我如何告诉PHPUnit期望500头球

我读过,但没用

该方法被包装在输出缓冲区中

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

如果安装了xdebug,则可以使用xdebug\u get\u headers()获取头。然后您可以根据需要测试它们

$headers=xdebug_get_headers();
获取一个数组,该数组看起来像

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

因此,您需要解析每个标题行,以将标题名称与值分开

如果无法在系统上使用xdebug\u get\u标题,另一种方法是模拟标题函数

我现在使用下面的方法,效果很好。假设你有这个代码

<?php
header('Content-type: text/plain; charset=UTF-8');
...
可测试类的实现如下所示。请注意,函数只需要在前面加上
可测试::
。否则,它们的工作原理与通常的功能相同

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();
      }
   }
}
现在,您只需要在测试中定义
单元测试
,而不是在生产中。然后,当您要测试头文件时,只需调用
Testable::headers\u list()


当然,您应该为setcookie、headers\u sent和任何其他发出HTTP头的函数添加方法。

另一种可能的方法是为您正在测试的命名空间重写
header
php函数。

名称空间我的\应用程序\名称空间;
使用我的\Test\Application\Namespace;
//这将覆盖该命名空间的header函数
//只有在调用该函数时没有反斜杠,它才起作用
函数头($string){
HeaderCollector::$headers[]=$string;
}
名称空间My\Test\Application\namespace
/**
*班长收集器
*将其与函数头覆盖结合使用
*对于名称空间My\Application\namespace
*我们可以对发送的头进行断言
*/
班长收集器{
公共静态$headers=[];
//在测试类设置中调用此函数,以便在每次测试之前清除headers数组
公共静态函数clean(){
self::$headers=[];
}
}
然后在你的测试课上

namespace My\Test\Application\namespace
使用PHPUnit\Framework\TestCase;
类MyTest扩展了TestCase{
受保护的函数设置(){
父::设置();
//每次测试都要清洁
HeaderCollector::clean();
}
公共函数testHeaders(){
//调用发送头的代码
...
self::assertEquals(
[“内容类型:text/html;字符集=UTF-8”,“另一个标题…”,
HeaderCollector::$headers
);
}
}

你可以保持代码干净,不需要xdebug

你确定这不适合你的情况吗?@JimmyKane-据我所知,这不比任何模仿都好。您可以在生产代码中保留对Testable::header的调用,只要在生产单元中未定义测试。我的意思是,您必须向类中添加一个静态函数,从而修改可测试的类。我不想在每个发送头的摘要中编辑和添加一个静态文件,以便可以测试。但这只是一种偏好。除此之外,你的答案是好的。祝你度过愉快的一天。啊,可测试类不是被测试的类。它的意思是“这是一个可测试的头函数”,而不是标准的头函数。我选择的类名不是很清楚,我会编辑使它更清楚。希望现在更清楚一点。谢谢你的评论,肯定是为了更好的回答!这对于
标题('Content-Type:text/html')格式的调用非常有效但它似乎不适用于
头格式的调用(“HTTP/1.1500内部服务器错误”)是否仍有获取这些标题/状态代码的方法?虽然您无法从
标题(“HTTP/1.1500内部服务器错误”)获取实际标题内容,您可以使用内置检索将返回到浏览器的HTTP状态代码。
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();
      }
   }
}