Mock an ArrayObject with PHPUnit


Mock an ArrayObject with PHPUnit

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