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