热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ZendFramework2和PHPUnit-模拟Zend\Db\Adapter\Adapter类

如何解决《ZendFramework2和PHPUnit-模拟Zend\Db\Adapter\Adapter类》经验,请问有没有懂的朋友?

几年前,我按照本教程开始学习Zend Framework .在那里,它显示使用Zend\Db\Adapter\Adapter类创建映射器以获取数据库连接,这就是我使用数据库的方式,因为没有问题.

我现在正在尝试学习如何在Zend应用程序上使用PHPUnit,并且在测试mapper中的函数时遇到了困难,因为我无法模拟Zend\Db\Adapter\Adapter类.

Zend网站上的本教程展示了模拟数据库连接,但它使用了Zend\Db\TableGateway\TableGateway该类.我在网上找到的所有其他教程使用此类过了,我就发现的唯一Zend\Db\Adapter\Adapter类是这样:

$date = new DateTime();
$mockStatement = $this->getMock('Zend\Db\Adapter\Driver\Pdo\Statement');
$mockStatement->expects($this->once())->method('execute')->with($this->equalTo(array(
    'timestamp' => $date->format(FormatterInterface::DEFAULT_DATETIME_FORMAT)
)));

$mockDbDriver = $this->getMockBuilder('Zend\Db\Adapter\Driver\Pdo\Pdo')
    ->disableOriginalConstructor()
    ->getMock();

$mockDbAdapter = $this->getMock('Zend\Db\Adapter\Adapter', array(), array($mockDbDriver));
$mockDbAdapter->expects($this->once())
    ->method('query')
    ->will($this->returnValue($mockStatement));

我已经尝试将它放入我的setUp方法但phpunit在测试类上运行会给我以下错误:

致命错误:在第128行的C:\ Program Files(x86)\ Zend\Apache2\htdocs\test_project\vendor\zendframework\zend-db\src\Sql\Sql.php中调用null上的成员函数createStatement()

所以我的问题是,你如何Zend\Db\Adapter\Adapter在PHPUnit中模拟类?

我已经看到了这个类似的问题,但是使用了一个Zend/Db/Adapter/AdapterInterface代替,我似乎无法将该代码转换成我的情况.Mapper和测试类代码如下.

ProductMapper.php:

public function __construct(Adapter $dbAdapter) {
    $this->dbAdapter = $dbAdapter;
    $this->sql = new Sql($dbAdapter);
}

public function fetchAllProducts() {
    $select = $this->sql->select('products');

    $statement = $this->sql->prepareStatementForSqlObject($select);
    $results = $statement->execute();

    $hydrator = new ClassMethods();
    $product = new ProductEntity();
    $resultset = new HydratingResultSet($hydrator, $product);
    $resultset->initialize($results);
    $resultset->buffer();

    return $resultset;
}

ProductMapperTest.php:

public function setUp() {
    $date = new DateTime();

    $mockStatement = $this->getMock('Zend\Db\Adapter\Driver\Pdo\Statement');
    $mockStatement->expects($this->once())->method('execute')->with($this->equalTo(array(
            'timestamp' => $date->format(FormatterInterface::DEFAULT_DATETIME_FORMAT)
    )));

    $mockDbDriver = $this->getMockBuilder('Zend\Db\Adapter\Driver\Pdo\Pdo')->disableOriginalConstructor()->getMock();

    $this->mockDbAdapter = $this->getMock('Zend\Db\Adapter\Adapter', array(), array(
            $mockDbDriver
    ));
    $this->mockDbAdapter->expects($this->once())->method('query')->will($this->returnValue($mockStatement));
}

public function testFetchAllProducts() {
    $resultsSet = new ResultSet();

    $productMapper = new ProductMapper($this->mockDbAdapter);

    $this->assertSame($resultsSet, $productMapper->fetchAllProducts());
}

编辑#1:

继Wilt的回答之后,我改变了我的mapper以Sql在构造函数中使用该类并将我的Test类更改为:

public function setUp() {
    $mockSelect = $this->getMock('Zend\Db\Sql\Select');

    $mockDbAdapter = $this->getMockBuilder('Zend\Db\Adapter\AdapterInterface')->disableOriginalConstructor()->getMock();

    $this->mockStatement = $this->getMock('Zend\Db\Adapter\Driver\Pdo\Statement');

    $this->mockSql = $this->getMock('Zend\Db\Sql\Sql', array('select', 'prepareStatementForSqlObject'), array($mockDbAdapter));
    $this->mockSql->method('select')->will($this->returnValue($mockSelect));
    $this->mockSql->method('prepareStatementForSqlObject')->will($this->returnValue($this->mockStatement));
}

public function testFetchAllProducts() {
    $resultsSet = new ResultSet();

    $this->mockStatement->expects($this->once())->method('execute')->with()->will($this->returnValue($resultsSet));

    $productMapper = new ProductMapper($this->mockSql);

    $this->assertSame($resultsSet, $productMapper->fetchAllProducts());
}

但是,我现在收到以下错误:

ProductTest\Model\ProductMapperTest :: testFetchAllProducts断言两个变量引用同一个对象失败.

哪个来自这条线$this->assertSame($resultsSet, $productMapper->fetchAllProducts());.我是否错误地嘲笑了什么?


编辑#2:

正如Wilt所建议的那样,我改变了测试类来使用a StatementInterface来模拟语句,所以代码现在看起来像:

public function setUp() {

    $mockSelect = $this->getMock('Zend\Db\Sql\Select');

    $mockDbAdapter = $this->getMockBuilder('Zend\Db\Adapter\AdapterInterface')->disableOriginalConstructor()->getMock();

    $this->mockStatement = $this->getMock('Zend\Db\Adapter\Driver\StatementInterface');

    $this->mockSql = $this->getMock('Zend\Db\Sql\Sql', array('select', 'prepareStatementForSqlObject'), array($mockDbAdapter));
    $this->mockSql->method('select')->will($this->returnValue($mockSelect));
    $this->mockSql->method('prepareStatementForSqlObject')->will($this->returnValue($this->mockStatement));

}

public function testFetchAllProducts() {
    $resultsSet = new ResultSet();

    $this->mockStatement->expects($this->once())->method('execute')->with()->will($this->returnValue($resultsSet));

    $productMapper = new ProductMapper($this->mockSql);

    $this->assertSame($resultsSet, $productMapper->fetchAllProducts());
}

但是测试用例仍然如上所述失败.我没有改变嘲弄execute方法的代码行,因为我相信它已经返回了$resultsSet,但是我可能错了!


推荐阅读
  • 本文提供了详细的指导,帮助开发者了解如何使用PHP插件进行网站内容的翻译,特别是针对WordPress插件和主题的汉化及多语言支持。 ... [详细]
  • Django Admin 插件详解与应用
    本文介绍了 Django Admin 的主要功能及其在项目开发中的作用,包括如何通过模型类操作数据库、自定义 Admin 方法以及多种配置选项,旨在帮助开发者快速掌握 Django Admin 的使用技巧。 ... [详细]
  • 本文将从基础概念入手,详细探讨SpringMVC框架中DispatcherServlet如何通过HandlerMapping进行请求分发,以及其背后的源码实现细节。 ... [详细]
  • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
  • Go语言开发中的常见陷阱与解决方案
    本文探讨了在使用Go语言开发过程中遇到的一些典型问题,包括Map遍历的不确定性、切片操作的潜在风险以及并发处理时的常见错误。通过具体案例分析,提供有效的解决策略。 ... [详细]
  • 深入理解String.Format()方法的应用
    在.NET框架中,String.Format()方法是一种非常实用的工具,它能够帮助开发者以灵活多样的方式格式化字符串。本文将通过一个具体的示例,详细介绍如何利用String.Format()方法处理数值、日期时间和枚举类型的格式化。 ... [详细]
  • 主板市盈率、市净率及股息率的自动化抓取
    本文介绍了如何通过Python脚本自动从中国指数有限公司网站抓取主板的市盈率、市净率和股息率等关键财务指标,并将这些数据存储到CSV文件中。涉及的技术包括网页解析、正则表达式以及异常处理。 ... [详细]
  • 本文详细介绍了ASP.NET缓存的基本概念和使用方法,包括输出缓存、数据缓存及其高级特性,如缓存依赖、自定义缓存和缓存配置文件等。通过合理利用这些缓存技术,可以显著提升Web应用程序的性能。 ... [详细]
  • 在尝试通过HTTP请求访问位于http://www.xxx.cn/net/Clicked.asmx的Web服务时,发现输入特定参数后,偶尔会接收到不成功的响应,表现为XML格式的空字符串。此现象并非每次发生,其根本原因尚不明确。 ... [详细]
  • 本文探讨了在使用Python进行多进程编程时遇到的退出异常问题,并提供了一种有效的解决方案。尤其针对大量数据和高并发场景下的异常退出情况进行了优化。 ... [详细]
  • Flask框架下MySQL数据库的集成与应用
    本文详细探讨了如何在Flask框架中集成和使用MySQL数据库,通过具体的实例和代码演示,帮助开发者更好地理解和掌握Flask与MySQL的结合使用。 ... [详细]
  • 本文介绍了如何通过修改Discuz!NT源代码及其工具包DiscuzToolkit,实现在使用API回帖时能够指定用户ID(UID)。主要步骤包括扩展Reply类以支持UID字段,以及调整相关API接口来处理新的请求。 ... [详细]
  • 深入解析动态代理模式:23种设计模式之三
    在设计模式中,动态代理模式是应用最为广泛的一种代理模式。它允许我们在运行时动态创建代理对象,并在调用方法时进行增强处理。本文将详细介绍动态代理的实现机制及其应用场景。 ... [详细]
  • linq操作符:分组操作符
    分组是根据一个特定的值将序列中的元素进行分组。LINQ只包含一个分组操作符:GroupBy。GroupBy操作符类似于T-SQL语言中的GroupBy语句。来看看GroupBy的方 ... [详细]
  • 本文详细介绍了如何使用 Python 编程语言中的 Scapy 库执行 DNS 欺骗攻击,包括必要的软件安装、攻击流程及代码示例。 ... [详细]
author-avatar
张琪健V
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有