我的问题是我必须模拟一个扩展\ 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();
答案 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();