我刚刚开始使用PHPUnit进行一些测试,但是在检测输出时遇到了麻烦。
$ this-> hasOutput()返回false,即使我在回显数据。我究竟做错了什么?任何帮助,将不胜感激!

class DatabaseTest extends PHPUnit_Framework_TestCase
{
    public function testOutput() {
        SampleDB::echoOutput();
        $result = $this->hasOutput() ? "true" : 'false';
        echo $result;
    }
. . .


实现方式:

class SampleDB {
    public static function echoOutput(){
        echo "hello world!";
    }


运行测试:

phpunit DatabaseTest
PHPUnit 4.2.6 by Sebastian Bergmann.

.hello world!false.

Time: 55 ms, Memory: 1.75Mb

OK (2 tests, 0 assertions)

最佳答案

这是我的PHPUnit版本中的hasOutput的来源(3.7.34,因此您的可能有所不同;如果这样做,则我的以下结论可能不适用于您的特定情况):

/**
 * @return boolean
 * @since  Method available since Release 3.6.0
 */
public function hasOutput()
{
    if (strlen($this->output) === 0) {
        return FALSE;
    }

    if ($this->outputExpectedString !== NULL ||
        $this->outputExpectedRegex  !== NULL ||
        $this->hasPerformedExpectationsOnOutput) {
        return FALSE;
    }

    return TRUE;
}


仅在完成测试执行(包括output)后填充测试用例上的tearDown成员变量,因此在执行测试时该变量始终为空,因此hasOutput始终返回false。

我不确定hasOutput的预期用途是什么,因为在PHPUnit文档中找不到它。基于一些grepping,看起来好像在严格模式打开时使用它来抱怨测试是否完成并且具有未明确预期的输出。

如果您需要根据测试是否有任何输出来有条件地在测试中执行某些操作,则应该可以使用getActualOutput()(同样是该函数的3.7.x版本;可能在4中进行了更改),该结果将返回当前缓冲的输出字符串。

您还可以使用诸如expectOutputString()之类的断言。

例如

    public function testOutput() {
            SampleDB::echoOutput();
            $result = ($this->getActualOutput() != '') ? "true" : 'false';
            $this->expectOutputString('hello world!');
            echo $result;
    }


在这种情况下,断言将失败,因为测试的实际输出为'helloworld!true'

10-05 20:08