是否有可能使用Listener模仿PHPUnit的输出到控制台结果?

时间:2012-02-09 22:55:42

标签: php phpunit

情况

我正在为PHPUnit实现一个监听器,它将测试结果记录到数据库中供以后查看。当遇到失败,错误,跳过或不完整的测试时,我喜欢将控制台的默认信息phpunit输出。

示例:

1) sandbox_ExtensionSampleTest::testError
printf(): Too few arguments

E:\ecom_testing\tests_v2\TestSuites\sandbox\Base.php:28
E:\ecom_testing\tests_v2\TestSuites\sandbox\ExtensionSampleTest.php:37
C:\Program Files (x86)\EasyPHP-5.3.8.1\php\pear\pear\PHPUnit\Framework\TestCase.php:939
C:\Program Files (x86)\EasyPHP-5.3.8.1\php\pear\pear\PHPUnit\Framework\TestCase.php:801
C:\Program Files (x86)\EasyPHP-5.3.8.1\php\pear\pear\PHPUnit\Framework\TestResult.php:649
C:\Program Files (x86)\EasyPHP-5.3.8.1\php\pear\pear\PHPUnit\Framework\TestCase.php:748
C:\Program Files (x86)\EasyPHP-5.3.8.1\php\pear\pear\PHPUnit\Framework\TestSuite.php:772
C:\Program Files (x86)\EasyPHP-5.3.8.1\php\pear\pear\PHPUnit\Framework\TestSuite.php:745
C:\Program Files (x86)\EasyPHP-5.3.8.1\php\pear\pear\PHPUnit\TextUI\TestRunner.php:325
C:\Program Files (x86)\EasyPHP-5.3.8.1\php\pear\pear\PHPUnit\TextUI\Command.php:187
C:\Program Files (x86)\EasyPHP-5.3.8.1\php\pear\pear\PHPUnit\TextUI\Command.php:125
C:\Program Files (x86)\EasyPHP-5.3.8.1\php\pear\phpunit:44

FAILURES!
Tests: 1, Assertions: 0, Errors: 1.

注意:我确实发现列出了输出中的所有PHPUnit依赖项a bug,但上面的示例仍然显示了两个相关的测试文件。

问题

实现的侦听器方法的一个参数是Exception $e。我可以使用$e获取消息以及第一行,但我似乎无法获得其他行。

在阅读PHP手册中的例外后,我认为使用$e->getPrevious()会起作用...尝试执行以下操作:

// Storing in a array to put into a DB later
// First line with the message
$trace[] = sprintf(
    "%s\n\n%s:%s\n", 
    $e->getMessage(), 
    $e->getFile(), 
    $e->getLine()
);

// Go through the rest of the exceptions of files and lines
while ($e = $e->getPrevious()){
    $trace[] = sprintf(
        "%s:%s\n", 
        $e->getFile(), 
        $e->getLine()
    );
}

那不起作用。似乎$e->getPrevious()是空的,我在转储对象时确认了它。我认为像$e->getTraceAsString()之类的东西会产生相同的结果,但这不是我的预期(我没有多少例外)

1 个答案:

答案 0 :(得分:0)

文件和行号组合列表称为stack trace。您可以使用Exception::getTrace()将其作为数组获取并自行完成,或者您可以通过调用PHPUnit_Util_Filter::getFilteredStacktrace()让PHPUnit为您过滤掉它的类。传递异常$etrue以接收格式化字符串,或者传递false以取代过滤后的数组。