如何测试预期的标题?
我有一个单元测试失败,因为标题已经发送。但是,在这种情况下,标题是预期的。如何测试预期的标题?
如何告诉PHPUnit期望500头?
我读过this question但它没有帮助。
该方法包装在输出缓冲区内。
ob_start();
$foo->methodWhichSendsHeader();
ob_clean();
如果您安装了xdebug,则可以使用xdebug_get_headers()获取标头。然后你可以根据需要测试它们。
$headers=xdebug_get_headers();
让你的阵列,它看起来像......
array(
0 => "Content-type: text/html",
1 => ...
)
所以你需要分析每个标题行,如果你可以”标题名称从值
这对于格式为 'header('Content-Type:text/html');' 的调用非常适用,但它似乎不适用于格式为 的头文件('HTTP/1.1 500 Internal Server错误');' 有无论如何得到这些头/状态代码? – Derokorian 2014-10-12 16:31:02
虽然你不能从header('HTTP/1.1 500 Internal Server Error');'获得实际的头部内容,但你可以使用内置的[http_response_code()](http://php.net) /manual/en/function.http-response-code.php)来检索将返回给浏览器的HTTP状态码。 – JSmitty 2016-08-29 14:48:40
分离在系统上使用xdebug_get_headers,另一种方法是模拟头文件函数。
我现在正在使用以下工具,效果很好。比方说,你有这样的代码......
<?php
header('Content-type: text/plain; charset=UTF-8');
...
我更换header
一个头功能,可测试是这样的......
<?php
Testable::header('Content-type: text/plain; charset=UTF-8');
...
可测试类执行如下。请注意,函数只需要在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标头的函数添加方法。
是的,但这改变了测试的主题。这不好。 – 2013-12-18 18:02:15
@JimmyKane - 据我所知,只不过是任何模拟。只要在生产中UNIT_TESTING没有定义,您可以将产品代码中的Testable :: header保存到调用中。有什么我在这里失踪? – 2013-12-18 19:10:53
我的意思是,你必须为你的类添加一个静态函数,从而修改'Testable'类。我不想在每个发送标题的摘要中编辑和添加一个静态的,以便可测试。但这只是一种偏好。除此之外,你的答案是好的。祝你有美好的一天。 – 2013-12-18 19:33:05
你确定[这个答案](http://stackoverflow.com/a/190498/212940)对你的情况不正确吗? – vascowhite 2012-02-03 18:08:34