我正在编写我的第一个控制器测试。在内部,控制器必须调用(或扩展)试图连接到数据库的文件。但是,我不希望它实际连接到数据库,因为那不是我现在正在测试的(...或者我应该?)。无论如何,我如何模拟/存根(不确定正确的术语是什么)对数据库的调用?或者,我怎么能至少拦截任何电话,以便知道它们在哪里发生?
答案 0 :(得分:1)
一般答案:是的“mocking”是正确的术语。您想要创建一个“假”对象,该对象采用已知输入并生成已知输出。
首先:我没有测试Zend Framework Controller的经验。从SO问题来看,似乎相当复杂。因此,如果没有一些示例代码,我就无法生成工作/工作类型的示例。
但是,我不希望它实际上连接到数据库,因为那不是我现在正在测试的(...或者我应该?)。
第一个:我不确定你是否想要真正连接到数据库。单元测试的“纯粹”形式告诉你对假冒数据库(sqlite,在memomry中)工作,而我目前想确保我的查询对真正的数据库实例起作用,所以我再次测试我的数据库访问对象真正的数据库。这让我想到了下一点。
您的控制器不应与数据库通信。即使(全部/多个)模型直接与数据库交谈也不是许多人认为适当的MVC,但是将SQL放在控制器中就像在PHP 4天中将html放在应用程序逻辑PHP代码中一样。
作为一般答案:
查看获取$ objectToMockOutInQuestion的代码。当它来自构造函数参数的方法时,你已经赢了,你可以把它传入。当你的代码从容器中取出它时,看看你是否可以,但事先在那个容器中。如果它是一个普通的new
运算符,您可能想要更改代码。
希望这有助于它只是文本