我的问题是,我必须模拟一个扩展''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();
原因是phpunit将从ItemCollection
中截取所有方法(因为您没有指定任何方法)。如果您要指定至少一个方法(例如通过setMethods
方法),那么phpunit将只存根这些指定的方法,其余的方法将保持在原始类中(例如getIterator
方法)。
所以,问题是——你为什么需要模拟那个班级?如果你只想从中得到一个stub/mock方法,那么只为它做一个:
$mockIC = $this->getMockBuilder(''SK'API'Model'ItemCollection'ItemCollection')
->setMethods(array('methodYouWantStub'))
->setConstructorArgs(array($this->container->get('mongo.db')))
->getMock();