代码在PHPUnit初始化之前执行

时间:2011-10-11 15:23:04

标签: php unit-testing phpunit code-coverage

我正在阅读我的项目的代码覆盖率报告,我注意到一些奇怪的事情:一条线被发现,但我确信这条线在测试期间被执行了。所以,我之前添加了一个 var_dump(),这是我在执行测试时得到的:

bool(true)
PHPUnit 3.5.5 by Sebastian Bergmann.

...

这很奇怪。如何在PHPUnit初始化之前执行一行?我相信这就是为什么代码覆盖率表明该行未被发现的原因。

任何提示?

编辑:这是一些代码。它是一个IRC框架,它利用Doctrine Common库来读取注释,还使用 ClassLoader EventDispatcher Symfony组件。这是有罪的方法:

/**
 * Returns this module's reflection.
 * 
 * @return \ReflectionClass
 * @access public
 */
static public function getReflection()
{
    // The var_dump() displaying bool(false) is executed before PHPUnit, while the other
    // ones are correctly executed.
    var_dump(is_null(self::$reflection));

    if (null === self::$reflection) {
        // This line is reported as uncovered, but it must be executed since I'm
        // accessing the reflection!
        self::$reflection = new \ReflectionClass(get_called_class());
    }

    return self::$reflection;
}

您怎么看?

2 个答案:

答案 0 :(得分:1)

  

然后,为什么所有其他的var_dump()(该方法在应用程序中多次执行)显示在PHPUnit的输出之后?为什么即使执行了代码覆盖范围内也没有报告该行?

我假设(但这只是因为你没有显示代码而很难说,因为它与在文件包含上执行的代码相关,而是在执行实际测试函数或实例化测试用例之后)。

答案 1 :(得分:0)

必须在初始化self::$reflection的单元测试之外调用访问器。之后,对getReflection()的所有进一步调用都会跳过if块,因此永远不会被视为已覆盖。在运行任何测试或跟踪代码覆盖率之前,PHPUnit实例化所有测试用例类 - 每个测试方法一个,数据提供者方法和数据提供者参数数组。查找从其构造函数或类本身外部调用getReflection()的测试用例,其中代码在加载时执行。

我忘了如果在PHPUnit输出版本之前实例化测试用例并且现在无法检查,但我相信是这种情况。另一种可能是您从getReflection()拨打bootstrap.php,但您可能已经检查过了。