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.
PHP的内置计数函数应该调用模拟计数方法(就像它在phpunit 3.4中那样),因为模拟类正在实现Countable。 – HorusKol 2014-10-06 22:28:12
如果您只是在模拟中为所有方法使用'any',那么这对PHPUnit及其实现中的结构更改是否有帮助?否则无法确定。 – 2014-10-07 15:01:03