PHPUnit - 使用 $_POST 变量测试 MVC 控制器
Posted
技术标签:
【中文标题】PHPUnit - 使用 $_POST 变量测试 MVC 控制器【英文标题】:PHPUnit - test MVC controller with $_POST variable 【发布时间】:2010-12-28 11:27:47 【问题描述】:我开始与 Kohana 一起使用 phpUnit。我的应用程序有许多控制器,它们只是从某种形式获取数据,验证和插入/更新/删除到/-/来自数据库。我应该如何为此编写测试用例。
我知道,如果我想测试一个函数,我会编写数据提供程序函数并将返回值与预期值进行比较。但是我的输入数据(来自表单的数据)正在$_POST
变量中传递。我应该如何测试这个?在那之后,我应该检查插入的数据是否真的在数据库中?请给我一些此类测试的指导方针或一些示例/教程的链接。谢谢。
【问题讨论】:
【参考方案1】:首先,如果您正在测试从接收 POST 数据到检查数据库中的值的所有过程,这不再是单元测试:您不是在测试一个组件与其他组件隔离,而是在测试将这些组件集成在一起。
这让测试变得更加困难:
您必须以更难的方式提供数据:不仅仅是作为方法的参数,而是作为整个应用程序的参数(例如,这里意味着伪造 POST 数据) 您还有更多事情需要验证:不仅仅是方法的返回值,或者它是否引发了异常 您有几个不同且可能不相关的事情可能导致失败(某些 PHP 代码中的问题、数据库中的问题、数据库服务器不可用......),这将导致失败更难找到原因。请注意,我并没有说那种“集成”测试没有用,顺便说一句;-)
不过,伪造$_POST
数组非常简单:它不是只读的,你可以在其中存储任何你想要的东西。
因此,在您的测试用例开始时,没有什么能阻止您在其中注入所需的任何数据。
【讨论】:
【参考方案2】:帕斯卡所说的。另外,请注意,有专门用于测试 http/浏览器级别交互的工具。您可以使用 SimpleTest 的 Web 测试用例(使用模拟/可编写脚本的浏览器)。如果您更喜欢 PhpUnit,我认为您可以在 PhpUnit 中相当轻松地使用 SimpleTest 的浏览器。否则会有更重量级的 Selenium IDE,PhpUnit 已经集成了它。
【讨论】:
【参考方案3】:我同意 Pascal 的观点,即 $_POST 数组不是只读数组,您可以根据需要对其进行操作。 这也取决于你的框架,Zendframework 提供了灵活的操作变量 如链接中的示例所示
http://xebee.xebia.in/2010/02/05/test-driven-development-with-zend-framework-and-phpunit/comment-page-1/#comment-3431
但是在这里你失去了使用 PHPUnit 内置函数的优势,比如(断言、数据提供者等) 但在大多数情况下,我们使用全局数组 $_POST、$_GET 或 $_REQUEST,当我们看到 PHPUnit 示例时,我们会在 Google 上搜索“如何在 PHPUnit 中设置 POST 变量” 由于 PHPUnit 没有演示 MVC 测试用例(虽然这有点用勺子喂) 我们需要获取我们框架的实例,然后我们可以玩我们的框架和 PHPUnit 你的测试方式也将与其他方式不同
【讨论】:
以上是关于PHPUnit - 使用 $_POST 变量测试 MVC 控制器的主要内容,如果未能解决你的问题,请参考以下文章
在 laravel 4 中使用 phpunit 测试 POST