PHPUnit - 尝试@cover不存在的方法

时间:2012-09-27 11:49:21

标签: php phpunit code-coverage

我的测试用例如下:

class FooTest extends PHPUnit_Framework_TestCase {

    /** @covers MyClass::bar */
    function testBar()
    {
        $result = MyClass::bar();
        $this->assertSomething($result);
    }

}

现在,测试本身运行得很好,但代码覆盖率抱怨:

PHP_CodeCoverage_Exception: Trying to @cover not existing method "MyClass::bar *//**".

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

校正

这个问题不在PHPUnit中,而是在PHP_CodeCoverage中。解析逻辑在某种程度上是重复的,PHPUnit修复(见下文)在这种情况下没有帮助。

为3.6修复此问题的修补程序是:

diff --git a/PHP/CodeCoverage/Util.php b/PHP/CodeCoverage/Util.php
index f90220d..54ce44b 100644
--- a/PHP/CodeCoverage/Util.php
+++ b/PHP/CodeCoverage/Util.php
@@ -196,12 +196,12 @@ class PHP_CodeCoverage_Util
         } catch (ReflectionException $e) {
             return array();
         }
-        $docComment = $class->getDocComment() . $method->getDocComment();
+        $docComment = substr($class->getDocComment(), 3, -2) . PHP_EOL . substr($method->getDocComment(), 3, -2);

         foreach (self::$templateMethods as $templateMethod) {
             if ($class->hasMethod($templateMethod)) {
                 $reflector   = $class->getMethod($templateMethod);
-                $docComment .= $reflector->getDocComment();
+                $docComment .= substr($reflector->getDocComment(), 3, -2);
                 unset($reflector);
             }
         }

我已在https://github.com/sebastianbergmann/php-code-coverage/issues/121打开了此门票。

在发布此修复程序之前(很有可能只发生在PHPUnit 3.7中),您需要使用三个内核。


旧答案:

旧版本的PHPUnit不适用于一行注释。

PHPUnit试图找到一个名为"MyClass::bar *//**"

的类/方法组合

使用三行注释适用于所有版本

/** 
 * @covers MyClass::bar 
 */

我修复了 PHPUnit 3.6.4

Issue 328

PHPUnit >= 3.6.4开始,您的代码应该可以正常运行。

答案 1 :(得分:3)

另一个原因(在我的情况下是原因)是不使用包含命名空间的完整类名。

// Should be like
@covers \Vendor\Module\MyClass::doSomething