phpunit没有识别使用count()

时间:2014-10-03 06:33:15

标签: php interface count mocking phpunit

我有一个实现内置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文档中找不到任何可以帮助解决这个问题的东西 - 我错过了什么吗?

2 个答案:

答案 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())的行为与我期望的完全一样。