2013-07-29 2 views
0

Моя проблема заключается в том, что я должен издеваться класс, который простирается \ ArrayObject и я хочу использовать этот высмеивал объект в Еогеасп, но я получаю это исключение:Mock ArrayObject с PHPUnit

Исключение: объекты, возвращенные Mock_ItemCollection_3ab4029b :: getIterator() должен быть проходимым или реализовать интерфейс итератор

Я проверил руководство и фактические типов в коде (с InstanceOf) и объект, который я получаю Traversable (но не итератор).

Как я могу решить эту проблему? (кстати, оригинальный класс отлично работает с Еогеаспом)

Update: Это, как я пытаюсь издеваться класс:

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

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

Вы могли бы показать, как вы издеваетесь над этим классом? – Cyprian

+0

Конечно, я обновил вопрос. – Damien

ответ

0

Причина заключается в том, что PHPUnit будет STUB всех метод из ItemCollection (потому что вы не указали ни одного из них). Если вы укажете хотя бы один метод (например, с помощью метода setMethods), то phpunit будет заглушать только эти указанные методы, а остальные останутся такими же, как в исходном классе (например, метод getIterator).

Итак, вопрос в том, почему вам нужно издеваться над этим классом? Если вы хотите, чтобы у него был только один метод, то сделайте это только для этого:

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

Спасибо! Я этого не осознавал ... – Damien

Смежные вопросы