我正在编写我的第一个控制器测试。在内部,控制器必须调用(或扩展)一个试图连接到数据库的文件。但是,我不希望它实际连接到数据库,因为这并不是我现在正在测试的内容(......或者我应该吗?)。无论如何,我如何模拟/存根(不确定正确的术语是什么)对数据库的调用?或者,我怎样才能至少拦截任何呼叫,以便我知道它们都在哪里发生?
问问题
340 次
1 回答
1
一般回答:是的,“嘲笑”在这里是正确的术语。您想创建一个“假”对象,该对象接受已知输入并产生已知输出。
首先:我没有测试 Zend 框架控制器的经验。从似乎相当复杂的SO问题来看。因此,如果没有一些示例代码,我将无法生成工作/工作示例。
但是,我不希望它实际连接到数据库,因为这并不是我现在正在测试的内容(......或者我应该吗?)。
首先:我不确定您是否要实际连接到数据库。单元测试的“纯”形式告诉您针对假数据库(sqlite,在内存中)工作,而我目前想确保我的查询针对真正的数据库实例工作,所以我再次测试我的数据库访问对象的真实数据库。这让我想到了下一点。
您的控制器不应与数据库通信。即使(所有/许多)模型直接与数据库对话也不是很多人认为合适的 MVC,但将 SQL 放入控制器中相当于将 html 放入应用程序逻辑 PHP 代码中的 php 4 天。
作为一个非常普遍的答案:
查看获得 $objectToMockOutInQuestion 的代码。当它来自构造函数参数的方法时,您已经赢得并且您可以将其传入。当您的代码将其从容器中拉出时,请查看是否可以事先将其放入该容器中。如果它是一个普通的旧new
运营商,您可能想要更改您的代码。
希望能有所帮助,所以它只是文字
于 2011-08-25T07:40:54.300 回答