如何在Zend_Test_PHPUnit_ControllerTestCase中模拟/存根对数据库的调用?

如何在Zend_Test_PHPUnit_ControllerTestCase中模拟/存根对数据库的调用?,php,phpunit,zend-test,Php,Phpunit,Zend Test,我正在编写我的第一个控制器测试。控制器必须在内部调用(或扩展)试图连接到数据库的文件。但是,我不希望它实际连接到数据库,因为这不是我现在正在测试的(…或者应该吗?)。无论如何,如何模拟/存根(不确定正确的术语是什么)对数据库的调用?或者,我如何至少截获任何呼叫,以便知道它们都发生在哪里?一般回答:是”,这是正确的术语。您希望创建一个“伪”对象,该对象接受已知的输入并生成已知的输出 首先:我没有测试Zend Framework控制器的经验。从这些看起来相当复杂的问题来看。因此,如果没有一些示例代码

我正在编写我的第一个控制器测试。控制器必须在内部调用(或扩展)试图连接到数据库的文件。但是,我不希望它实际连接到数据库,因为这不是我现在正在测试的(…或者应该吗?)。无论如何,如何模拟/存根(不确定正确的术语是什么)对数据库的调用?或者,我如何至少截获任何呼叫,以便知道它们都发生在哪里?

一般回答:是”,这是正确的术语。您希望创建一个“伪”对象,该对象接受已知的输入并生成已知的输出

首先:我没有测试Zend Framework控制器的经验。从这些看起来相当复杂的问题来看。因此,如果没有一些示例代码,我就无法生成一个有效的示例

但是,我不希望它实际连接到数据库,因为这不是我现在正在测试的(…或者应该吗?)

第一:我不确定你是否真的想连接到数据库。单元测试的“纯”形式告诉您针对一个伪数据库(sqlite,在memomry中),而我目前喜欢确保我的查询针对一个真实的db实例,所以我再次测试我的数据库访问对象—真实的db。这就引出了下一点

您的控制器不应与数据库通信。甚至(全部/许多)直接与数据库对话的模型并不是很多人认为合适的MVC,而是将SQL放入控制器是PHP相当于在PHP 4天内将HTML应用到应用程序逻辑PHP代码中。 作为一个非常笼统的回答:

在代码中查找$objecttomockoutin问题。当它来自一个构造函数参数的方法时,您已经赢了,您可以将它传入。当你的代码从一个容器中取出它时,看看你是否可以事先把它放在那个容器中。如果它是一个普通的旧
new
操作符,您可能需要更改代码

希望这有帮助,即使如此,这只是文本