PHPUnit - 使用$ _POST变量测试MVC控制器

时间:2009-12-20 11:15:40

标签: php post controller kohana phpunit

我开始与Kohana一起使用PHPUnit。我的应用程序有许多控制器,它只是从某种形式获取数据,验证和插入/更新/删除到/ - /从数据库。我该如何为此编写测试用例。

我知道如果我想测试一个函数,我会编写数据提供程序函数,只是将返回值与预期函数进行比较。但我的输入数据(来自表单的数据)正在$_POST变量中传递。我该怎么测试呢?之后,我应该检查插入的数据是否真的在数据库中?请给出我对这类测试的一些指导或链接到一些示例/教程。感谢。

4 个答案:

答案 0 :(得分:16)

首先,如果您正在测试从接收POSTed数据到检查数据库中的值的所有方式,那么这不再是单元测试:您没有单独测试一个组件,但是您正在测试将这些组件整合在一起。

这使得测试更加困难:

  • 您必须以更难的方式提供数据:不仅作为方法的参数,而且作为整个应用程序的参数(这意味着伪造POST数据,例如此处)
  • 您需要验证更多内容:不仅仅是方法的返回值,还是它引发了异常
  • 你有几个不同的,可能是不相关的东西,可能导致失败(一些PHP代码中的问题,数据库中的问题,数据库服务器不可用,......),这将导致失败更难找到他们的原因。


请注意,我没有说那种“集成”测试没用,顺便说一下; - )


仍然,伪造$_POST数组很简单:它不是只读的,你可以存储你想要的任何内容。

因此,在测试用例开始时,没有什么能阻止您注入所需的任何数据。

答案 1 :(得分:2)

帕斯卡说的是什么。另请注意,有一些工具专门用于在http /浏览器级别上测试交互。您可以使用SimpleTest的Web测试用例(使用模拟/可编写脚本的浏览器)。如果您更喜欢PhpUnit,我认为您可以在PhpUnit中轻松使用SimpleTest的浏览器。否则就会有更重量级的Selenium IDE,PhpUnit已经集成了它。

答案 2 :(得分:0)

我同意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示例时,我们谷歌“如何在PHPUnit中设置POST变量” 因为PHPUnit没有说明MVC测试用例(尽管有点勺子喂食) 我们需要获取框架的实例,然后我们可以使用我们的框架和PHPUnit 你的测试方式也会与其他方式不同

答案 3 :(得分:0)

你需要做的就是像这样设置post var。

$这 - > reques              - >使用setMethod( 'POST')              - > setPost(阵列(                'param1'=> 'VALUE1',                'param2'=> “值”             ));

我希望这对你有用

保持微笑Kdecom