2014-02-25 52 views
0

我正在通過zend tutorials,我正在用phpunit測試一個帶有模擬對象的類。當我通過從Zend的\ DB \ TableGateway創建一個模擬我的課,誰的構造函數需要一個Zend \ DB \ TableGateway,我得到一個錯誤類型:phpunit:模擬對象不愚弄php ​​

"...Argument 1 passed to Album\Model\AlbumTable::__construct() must be an instance of Zend\Db\TableGateway\TableGateway, instance of Mock_TableGateway_65b55cb0 given..." 

難道這發生的呢? phpunit模擬對象是否應該能夠「愚弄」這個類?

這裏是真正的類:

class AlbumTable { 
    protected $tableGateway; 

    public function __construct(TableGateway $tableGateway) { 
     $this->tableGateway = $tableGateway; 
    } 

    public function fetchAll() { 
     $resultSet = $this->tableGateway->select(); 
     return $resultSet; 
    } 

    public function getAlbum($id){ 
     $id = (int) $id; 
     $rowset = $this->tableGateway->select(array('id' => $id)); 
     $row = $rowset->current(); 
     if(!$row) { 
      throw new \Exception("Couldn't find row: $id"); 
     } 
     return $row; 
    } 

    public function saveAlbum(Album $album) { 
     $data = array(
      'artist' => $album->artist, 
      'title' => $album->title, 
     ); 

     $id = (int)$album->id; 
     if ($id == 0) { 
      $this->tableGateway->insert($data); 
     } else { 
      if ($this->getAlbum($id)) { 
       $this->tableGateway->update($data, array('id' => $id)); 
      } else { 
       throw new \Exception('Form id does not exist'); 
      } 
     } 
    } 

    public function deleteAlbum($id) { 
     $this->tableGateway->delete(array('id' => $id)); 
    } 

} 

和測試:

class AlbumTableTest extends PHPUnit_Framework_TestCase { 
    public function testFetchAllReturnsAllAlbums() { 
     $resultSet = new ResultSet(); 
     $mockTableGateway = $this->getMock('Zend\Db\TableGateway', 
      array('select'), array(), '', false); 

     $mockTableGateway->expects($this->once()) 
      ->method('select') 
      ->with() 
      ->will($this->returnValue($resultSet)); 

     $albumTable = new AlbumTable($mockTableGateway); 
     $this->assertSame($resultSet, $albumTable->fechAll()); 
    } 
} 

和錯誤:

Time: 102 ms, Memory: 5.00Mb 

There was 1 error: 

1) AlbumTest\Model\AlbumTableTest::testFetchAllReturnsAllAlbums 
Argument 1 passed to Album\Model\AlbumTable::__construct() must be an instance of Zend\Db\TableGateway\TableGateway, instance of Mock_TableGateway_65b55cb0 given, called in C:\Users\MEEE\Google Drive\code\iis\www\CommunicationApp\module\Album\test\AlbumTest\Model\AlbumTableTest.php on line 20 and defined 

C:\Users\MEEE\Google Drive\code\iis\www\CommunicationApp\module\Album\src\Album\Model\AlbumTable.php:9 
C:\Users\MEEE\Google Drive\code\iis\www\CommunicationApp\module\Album\test\AlbumTest\Model\AlbumTableTest.php:20 

FAILURES! 
Tests: 4, Assertions: 9, Errors: 1. 
+1

創建模擬後,做一個var_dump來查看instanceof是否返回true ... var_dump($ mockTableGateway instanceof Zend \ Db \ TableGateway); – gontrollez

回答

2

你是不是嘲笑正確的類。您正在創建一個Zend\Db\TableGateway的模擬,你需要真正的嘲笑Zend\Db\TableGateway\TableGateway

更改您測試代碼:

$mockTableGateway = $this->getMock('Zend\Db\TableGateway\TableGateway', 
     array('select'), array(), '', false); 

你假裝是失敗類型提示,因爲您不是嘲笑正確的類。

模擬對象將擴展您正在嘲笑的類,因此它們將成爲被模擬的類的一個實例。