2008-09-25 80 views
5

PHPUnit中测试$_GET$_POST输入的最佳方式是什么?在PHPUnit中测试表单输入

我有一个类来清理输入,并希望检查它在处理伪造数据时是否正常工作。有没有简单的方法来设置PHPUnit中的表单变量,或者我应该将验证传递给辅助类/提供表单变量的函数,以便间接测试它们?

回答

16

看看Dependency injection的想法。概括地说,你应该养活你的代码,它需要什么,而不是它得到它所需要的数据......下面是一个例子:

例如,而不依赖注入与依赖注入

function sanitize1() { 
    foreach($_POST as $k => $v) { 
    // code to sanitize $v 
    } 
} 

sanitize1(); 

例如

function sanitize2(array &$formData) { 
    foreach($formData as $k => $v) { 
    // code to sanitize $v 
    } 
} 

sanitize2($_POST); 

看到区别?在您的PHPUnit测试中,您可以通过sanitize2()您选择的关联数组;你已经注入了依赖。而sanitize1()加上$_POST$_POST$_GET无论如何都是关联数组,因此在您的生产代码中,您可以将$_GET$_POST传递给您的函数,但在您的单元测试中,您会难以编写一些预期数据。

单元测试例如:

function testSanitize() { 
    $fakeFormData = array ('bio' => 'hi i\'m arin', 'location' => 'San Francisco'); 
    sanitize($fakeFormData); 
    // assert something 
} 
+1

感谢您的 - 我想这可能是最好的解决方案。非常好的答案! – 2008-09-26 13:44:30