【问题标题】:How to override var_export in PHPUnit?如何覆盖 PHPUnit 中的 var_export?
【发布时间】:2010-11-15 21:22:16
【问题描述】:

在 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 的默认行为。

提前致谢。

【问题讨论】:

  • 你总是可以做$this->assertTrue($foo === true)...
  • 我不记得 PHP 默认堆栈跟踪是像兆字节这样的东西。你在用 Xdebug 还是什么的?
  • @Jani 我假设他没有谈论轨道跟踪而是转储变量(例如对象)。如果你有一个包含一本书(或 w/e)的成员变量的对象,那么这就是很多输出

标签: php unit-testing phpunit


【解决方案1】:

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

有问题的代码(print_r)位于: PHPUnit_Framework_ComparisonFailure_ObjecttoString() 方法,我看不到在不更改 phpunit 代码的情况下为该类提供另一个实现的方法(因为对象是在静态调用中创建的)

因此,为了调试,您可以将其更改为原地,而不是 ofc。导致您在更改 3rd 方代码时遇到的常见问题,并且由于您说您有很多代码,您可能不想这样做,因为您依赖 phpunit 按每个人的期望工作。

一种不依赖于更改 phpunit 代码的方法,可能比通过所有测试并更改所有 assertTrue() 调用更容易:

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

<?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);
    }
}

->

phpunit ErrorTest.php
PHPUnit 3.4.15 by Sebastian Bergmann.

F

Time: 0 seconds, Memory: 4.25Mb

There was 1 failure:

1) ErrorTest::test1
Expecting True, got Object of Type: stdClass

/home/mcsvnls/ErrorTest.php:15
/home/mcsvnls/ErrorTest.php:9

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

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

【讨论】:

  • 谢谢,有帮助。我自己查看了源代码,发现在 PHPUnit_Framework_Constraint::failureDescription() 中,它对未通过测试的值调用函数 PHPUnit_Util_Type::toString($other)。如果您将第二个参数 true 传递给该函数,它不会对变量执行 print_r。但是,无法更改该默认行为。我想出的最佳解决方案是重新定义 isTrue() 并让它返回 Zoosk_Constraint_IsTrue 的子类,它定义了 customFailureDescription() 函数。
猜你喜欢
  • 2014-06-07
  • 1970-01-01
  • 2012-08-07
  • 2018-06-21
  • 2020-05-02
  • 2012-05-04
  • 1970-01-01
  • 2016-10-22
  • 2012-03-10
相关资源
最近更新 更多