我刚刚开始学习PHPUnit。我有一个看似非常简单的测试;
namespace stats\Test;
use stats\Fetch;
class FetchTest extends \PHPUnit_Framework_TestCase
{
public function setUp()
{
$this->fetch = new Fetch;
}
public function testStoresListOfAssets()
{
$this->assertClassHasStaticAttribute('paths', 'Fetch'); //line 17
}
}
我的Fetch类是;
namespace stats;
class Fetch
{
public static $paths = array(
'jquery' => 'http://code.jquery.com/jquery.js'
);
}
运行PHPUnit时得到的错误;
PHPUnit_Framework_Exception: Argument #2 (string#Fetch)of PHPUnit_Framework_Assert::assertClassHasStaticAttribute() must be a class name
这可能是非常愚蠢但我无法理解的问题
答案 0 :(得分:1)
PHPUnit_Framework_Assert使用PHP方法 class_exists 来检查您指定的类名是否正确(选中this link以查看完整代码):
if (!is_string($className) || !class_exists($className, FALSE)) {
throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'class name');
}
你遇到的问题是class_exists没有考虑这个命令的方法:
use stats\Fetch;
因此,您必须指示完整路径才能使其正常工作。在this link of stackoverflow中,您可以找到有关该问题的更多信息。您应该将断言更改为以下内容:
$this->assertClassHasStaticAttribute('paths', '\\stats\\Fetch');
答案 1 :(得分:0)
您没有提供完全限定的类名,并且在assertClassHasStaticAttribute()的上下文或者(test)类范围之外的任何其他方法/函数中提供补充类名的use语句。
如果您使用的是PHP 5.5或更高版本(您应该使用它),请使用Fetch::class。
一般来说,您应该更喜欢:: class over strings of classes name,因为现代IDE可以帮助您在更改类名时进行重构,如果您使用字符串,这几乎是不可能的。
总结一下,对于你的例子,它将是:
public function testStoresListOfAssets()
{
$this->assertClassHasStaticAttribute('paths', Fetch::class);
}