PHPUnit_Framework_Assert :: assertClassHasStaticAttribute()必须是类名

时间:2015-11-06 09:59:57

标签: php phpunit

我刚刚开始学习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

这可能是非常愚蠢但我无法理解的问题

2 个答案:

答案 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);
}