我有一个实现内置Countable接口的PHP对象。然后我嘲笑这个对象进行单元测试:
$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无法识别count()的使用 - 我必须使用$results->count()
来满足断言。
PHPUnit 3.4没有这个问题。
我在PHPUnit文档中找不到任何可以帮助解决这个问题的东西 - 我错过了什么吗?
答案 0 :(得分:0)
Count是PHP的内部函数,在您的场景中不会被模拟。你嘲笑getMapper()调用count(getMapper->Count()
)。对于您的测试,只需模拟$this->getMapper("fulltext")->find()
并且不返回任何内容,因此PHP count()将等于0.
答案 1 :(得分:0)
事实证明我在PHPUnit的Zend实现中过度依赖自动加载行为,并且在PHPUnit的模拟对象中发生了变化。
在这种特定的情况下,由于Zend / PHPUnit和自动加载的限制,被模拟的类没有被自动加载(测试不是引导整个应用程序 - 也不应该,因为这应该是一个单元测试) - 这曾经导致PHPUnit 3.4中出现“未找到类”错误,但新的PHPUnit 4.x实现将构造一个存根类。存根类没有实现任何接口,因此内置的PHP count()不知道该对象是可数的。
我现在需要被模拟的类的特定源文件,而mock(和内置的PHP count())的行为与我期望的完全一样。