phpunit不承认使用count()

问题描述:

我有一个PHP对象,它实现了内置的Countable接口。我然后嘲笑此对象为一个单元测试:phpunit不承认使用count()

$mapper = $this->getMockBuilder("Search_Model_Mapper_Search") 
     ->disableOriginalConstructor() 
     ->setMethods(array("find", "count")) 
     ->getMock(); 
    $mapper->expects($this->once()) 
     ->method("find") 
     ->with(array("body" => "kajsgfkblkjasfgdjkb")) 
     ->will($this->returnValue($mapper)); 
    $mapper->expects($this->once()) 
     ->method("count") 
     ->will($this->returnValue(0)); 

和被测试的代码部分读取为:

$results = $this->getMapper("fulltext")->find(array("body" => $requestParams['q'])); 
    if (count($results) === 0) { 
     $this->view->messages[] = "Sorry, no results were found. Please check your search terms and try again"; 
     return; 
    } 

PHPUnit的4.0.17不能识别该使用次数()的 - 我必须使用$results->count()才能满足断言。

PHPUnit 3.4没有这个问题。

我无法找到任何东西来帮助解决PHPUnit文档中的这个问题 - 有什么我错过了吗?

原来我在PHPUnit的Zend实现中过度依赖自动加载行为,并且犯规PHPUnit的模拟对象发生变化。

在这个特定的情况下,由于Zend/PHPUnit和自动加载的限制,被模拟的类没有被自动加载(测试不会自动引导整个应用程序 - 也不应该,因为这应该是一个单元测试) - 这会导致PHPUnit 3.4中出现“未找到类”错误,但新的PHPUnit 4.x实现将编译存根类。存根类没有实现任何接口,因此内置的PHP count()不知道对象是Countable。

我现在已经要求被模拟的类的具体源文件,并且模拟(和内置的PHP count())的行为完全如我所料。

Count是PHP的内部函数,并未在您的场景中被嘲弄。你嘲笑getMapper()调用来计数(getMapper->Count())。对于你的测试,只需模拟$this->getMapper("fulltext")->find()并且不返回任何内容,所以PHP count()将等于0.

+0

PHP的内置计数函数应该调用模拟计数方法(就像它在phpunit 3.4中那样),因为模拟类正在实现Countable。 – HorusKol 2014-10-06 22:28:12

+0

如果您只是在模拟中为所有方法使用'any',那么这对PHPUnit及其实现中的结构更改是否有帮助?否则无法确定。 – 2014-10-07 15:01:03