我的测试用例如下:
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 *//**".
有什么想法吗?
答案 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试图找到一个名为"MyClass::bar *//**"
/**
* @covers MyClass::bar
*/
我修复了 PHPUnit 3.6.4
。
从PHPUnit >= 3.6.4
开始,您的代码应该可以正常运行。
答案 1 :(得分:3)
另一个原因(在我的情况下是原因)是不使用包含命名空间的完整类名。
// Should be like
@covers \Vendor\Module\MyClass::doSomething