我试图为写入error_log
的类编写PHPUnit测试,但似乎在PHPUnit的输出缓冲方面遇到了麻烦。
由于error_log
在给定一个未知的SUT php.ini配置时可能存在波动性,因此在writing to stdout取得有限成功后,我最终决定overloading via namespace。
不幸的是,似乎有一些关于PHPUnit缓冲输出的怪癖,因为调用expectOutputString
返回一个空字符串为" Actual"而不是写给stdout的内容。
这是一个快速而肮脏的测试课,我写的是为了消除任何可能让我意外悲伤的东西(" ObTest.php"):
<?php
namespace Some\Test;
class ObTest
{
public function writeToErrorLog($message)
{
error_log($message);
}
}
这是我写的测试:
<?php
namespace Some\Test;
include "ObTest.php";
class ObTestTest extends \PHPUnit_Framework_TestCase
{
public static $error_log_config;
public static function setUpBeforeClass()
{
self::$error_log_config = ini_get("error_log");
ini_set("error_log", "/dev/stdout");
}
public static function tearDownAfterClass()
{
ini_set("error_log", self::$error_log_config);
}
public function testWriteToErrorLogOutputs()
{
$ob_test = new ObTest();
$this->expectOutputString("Test");
$ob_test->writeToErrorLog("Test");
}
}
最后输出:
PHPUnit 5.4-g9b5b99b by Sebastian Bergmann and contributors. [06-May-2016 01:05:51 UTC] Test Failed asserting that two strings are equal. Expected :'Test' Actual :''
请注意,由于时间戳的原因,我确实认为测试无论如何都会失败,但是用expectOutputRegex
编写测试是不必要的,以证明空白字符串被返回为&#34; Actual&#34 ;;我可以确认使用正则表达式选项获得相同的结果。
我正在运行PHP 5.6.20-1 + deb.sury.org~trusty + 1如果它是相关的。
根据评论,我尝试了几种设置error_log
的变体来写入输出,包括STDOUT
常量和php://output
流,但都没有成功。
对于任何感兴趣或遇到类似问题的人,我也记录了issue on GitHub认为这可能是某种错误,但是在此更新中它还没有得到任何关注。该问题指出,我还在最新稳定的PHPUnit版本(5.3.2)上尝试了此操作但没有成功。