使用PHPUnit模拟ArrayObject

时间:2013-07-29 14:31:35

标签: php mocking phpunit arrayobject

我的问题是我必须模拟一个扩展\ ArrayObject的类,我想在foreach中使用这个模拟对象,但是我得到了这个例外:

异常:Mock_ItemCollection_3ab4029b :: getIterator()返回的对象必须是可遍历的或实现接口Iterator

我已经检查了手册和代码中的实际类型(使用instanceof),我得到的对象是Traversable(但不是Iterator)。

我该如何解决这个问题? (顺便说一句,原来的课程与foreach一起工作很好)

更新 这就是我尝试模拟这个类的方法:

class ItemCollection extends \ArrayObject implements StatefulInterface, ItemCollectionInterface {...}

$mockIC = $this->getMockBuilder('\SK\API\Model\ItemCollection\ItemCollection')
            ->setConstructorArgs(array($this->container->get('mongo.db')))
            ->getMock();

1 个答案:

答案 0 :(得分:0)

原因是phpunit会从ItemCollection中删除所有方法(因为你没有指定任何方法)。如果你要指定至少一个方法(例如通过setMethods方法),那么phpunit将只存储这些指定的方法,其余的将保持原始类(例如getIterator方法)。< / p>

所以,问题是 - 为什么你需要嘲笑那个班级?如果你想要存根/模拟只有一个方法,那么只针对那个方法:

 $mockIC = $this->getMockBuilder('\SK\API\Model\ItemCollection\ItemCollection')
        ->setMethods(array('methodYouWantStub'))
        ->setConstructorArgs(array($this->container->get('mongo.db')))
        ->getMock();