PHPUnit - hasOutput()不起作用

时间:2014-10-03 20:40:59

标签: php testing phpunit

我刚刚开始使用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)

1 个答案:

答案 0 :(得分:0)

以下是我的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将总是返回假。

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

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

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

e.g。

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

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