2014-02-25 51 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); 

你假装是失败类型提示,因为您不是嘲笑正确的类。

模拟对象将扩展您正在嘲笑的类,因此它们将成为被模拟的类的一个实例。