如何在PHPUnit中覆盖var_export?

时间:2010-11-15 21:22:17

标签: php unit-testing phpunit

在PHPUnit中,有时断言失败,并且在报告断言时,PHPUnit会自动调用变量上的var_export()。假设您调用了这段代码:

$foo = new StdClass();
$foo->bar = 123;
$foo->baz = "Hi there";
$this->assertTrue($foo);

输出是:

Failed asserting that 
stdClass Object
(
   [bar] => 123
   [baz] => Hi there
)
is true.

如果变量是Exception对象,这可能导致单元测试在遍历对象树时打印出兆字节的文本,包括堆栈跟踪和其他信息。有时PHPUnit会因为内存不足而试图输出所有内容。

我知道一个解决方案是添加一个额外的测试,在执行assertTrue之前检查变量是否为对象,或者是assertEquals。但我的团队目前有很多单元测试。

所以我想知道是否有办法在生成错误报告时覆盖PHPUnit在变量上调用var_export的默认行为。

提前致谢。

1 个答案:

答案 0 :(得分:1)

在挖掘了一些之后,我没有找到一个标志或者什么东西来实现这一点,所以我试图从代码中向后工作:

有问题的代码(print_r's)存在于: PHPUnit_Framework_ComparisonFailure_Object的{​​{1}}方法,我没有看到为该类提供另一个实现的方法而不更改phpunit中的代码(因为对象是在静态调用中创建的)

所以为了调试你可以改变它,但是那个.c。导致你在更改第三方代码时遇到的常见问题,因为你说你有很多代码,你可能不想这样做,因为你依赖phpunit按照每个人的预期工作。

一种不依赖于更改phpunit代码和的方式可能比通过所有测试并更改所有assertTrue()调用更麻烦可能是这样的:

如果您的所有测试都使用一个基类,则更容易放入:

toString()

- >

<?php

class ErrorTest extends PHPUnit_Framework_TestCase {

    public function test1() {
        $foo = new StdClass();
        $foo->bar = 123;
        $foo->baz = "Hi there";
        $this->assertTrue($foo);
    }

    public static function assertTrue($x) {
        if(is_object($x)) {
            self::fail("Expecting True, got Object of Type: ".get_class($x));
        }
        parent::assertTrue($x);
    }
}

虽然我不确定这是一个“好”的解决方案,但它是我现在能想到的最好的解决方案,也许它会有所帮助:)