oop - phpunit:模拟对象不愚弄 php

标签 oop unit-testing zend-framework2 phpunit

我正在通过 zend tutorials我正在用 phpunit 测试一个带有模拟对象的类。当我将从 Zend\Db\TableGateway 创建的模拟传递给我的类时,谁的构造函数需要 Zend\Db\TableGateway,我得到一个类型错误:

"...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.

最佳答案

你不是在 mock 正确的类(class)。您正在创建 Zend\Db\TableGateway 的模拟你需要真正模拟 Zend\Db\TableGateway\TableGateway
将您的测试代码更改为:

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

您的模拟未通过类型提示,因为您没有模拟正确的类。

模拟对象将扩展您正在模拟的类,因此它们将是被模拟的类的实例。

关于oop - phpunit:模拟对象不愚弄 php,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22017054/

相关文章:

unit-testing - 模拟Elasticsearch聚合

php - 参数编号无效

php - 无法在服务器上运行 Zend Framework 2 - 找不到类 'Zend\Mvc\Application'

node.js - NestJS( Node ) - 按通用类型验证请求

javascript - YUI.Test断言在事件回调中不会失败

php - 有什么方法可以在 PHP 中安全地重新声明一个类?

javascript - Angular 单元测试http请求问题

zend-framework2 - 我将如何记录成功的登录

java - 按返回类型或参数组织方法?

java - 作业概览 说明