2013-07-29 137 views
0
的ArrayObject的

我的問題是,我有嘲笑延伸\ ArrayObject的一類,我想在foreach使用這種嘲笑的對象,但我得到這個異常:模擬使用PHPUnit

例外:對象由返回Mock_ItemCollection_3ab4029b :: getIterator()方法必須是穿越或實現接口的Iterator

我檢查手冊和實際類型代碼(帶的instanceof)和我得到的對象是可遍歷的(但不是迭代器)。

我該如何解決這個問題? (順便說一句,原始類作品用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

你能告訴你如何嘲笑這個類? – Cyprian

+0

當然,我已經更新了這個問題。 – Damien

回答

0

的原因是,PHPUnit的將存根從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