我正在学习如何使用PHPUnit 4.3.5 / PHP 5.5.14进行单元测试。一切顺利,直到我试图获得我的代码覆盖率。我收到了这个错误:"尝试@cover或@use not not existing method" MyClass :: __ construct"当试图获得代码覆盖率。我尝试了其他SO答案,但无法修复它。我有什么想法,我做错了什么?谢谢!
/**
* Test constructor.
* @covers MyClass::__construct
* @group MyClassTest
*/
public function test_Can_Create_MyClass_Instance() {
$this->assertInstanceOf('MyClass', $this->_myClass);
}
答案 0 :(得分:14)
如果您希望@covers
注释与命名空间使用运算符一起使用,则会出现相同的错误。
以下代码不起作用:
<?php
namespace MyCompany\MyBundle\Test\UnitTest\Service;
use MyCompany\MyBundle\Service\ClassToTest;
class MyAwesomeTest
{
/**
* @covers ClassToTest::someMethod()
*/
public function testSomeMethod()
{
// do your magic
}
}
如果您按CTRL并单击它,PHPStorm等智能IDE会解决ClassToTest::someMethod()
注释,但PHPUnit会给您Trying to @cover or @use not existing method "ClassToTest::someMethod".
错误。
此处有一个拉取请求:https://github.com/sebastianbergmann/phpunit/pull/1312
作为一种解决方法,只需使用完整的班级名称:
<?php
namespace MyCompany\MyBundle\Test\UnitTest\Service;
use MyCompany\MyBundle\Service\ClassToTest;
class MyAwesomeTest
{
/**
* @covers \MyCompany\MyBundle\Service\ClassToTest::someMethod()
*/
public function testSomeMethod()
{
// do your magic
}
}
答案 1 :(得分:9)
如果您的类确实实现了__construct
方法,那么问题是找不到类本身。开始删除@covers注释,并检查是否可以加载该类。例如,在测试中尝试var_dump(class_exists('MyClass'));
(在我认为不会传递的断言之前)。
在注释中,通常在将类名作为字符串传递时,应始终使用其完整的命名空间名称引用该类:
\MyClass
\MyNamespace\MyClass