如何进行一个取决于〜real〜POST / GET数据的PHPUnit测试?

我创建了一个包含filter_input函数的PHP类,以使我们的开发人员的工作更轻松。
要使用urlnameage字段验证HTML表单,代码将如下所示:

$post = Filter::POST();
if ($post->validate_string('name') && $post->validate_integer('age')) {
    $url = $post->sanitize_url('url');
}

这将与以下内容相同:

if (filter_input(INPUT_POST,'name',FILTER_UNSAFE_RAW) && filter_input(INPUT_POST,'age',FILTER_VALIDATE_INTEGER)) {
    $url = filter_input(INPUT_POST,'url',FILTER_SANITIZE_URL);
}

那么,我认为代码已经完成了,现在我想为它创建一个PHPUnit测试。

问题是我不知道如何在PHPUnit方法上伪造GET / POST数据,而不是这种情况。
我不需要在$_POST插入值,我需要“真实”数据,因为filter_input处理脚本收到的数据,而不是实际的$_POST超全局。

我试过使用下面的PHPT测试和PHPUnit方法来实现这一点,但没有成功:

--TEST--
Generates POST and GET data to be used in FilterTest.php
--POST--
name=Igor&age=20
--GET--
name=Igor&age=19
--FILE--
<?php
echo $_POST['nome'].' = '.$_POST['idade'];
?>
--EXPECT--
Igor = 20

public function testPhpt() {
 $phpt = new PHPUnit_Extensions_PhptTestCase('FilterTest_data.phpt', array('cgi' => 'php-cgi'));
 $result = $phpt->run();
 $this->assertTrue($result->wasSuccessful());
}

编辑

原始代码 :http://pastebin.com/fpw2fpxM
用于初始测试的代码 :http://pastebin.com/vzxsBQWm
(对于葡萄牙人来说很抱歉,我知道用英文编码会更好,但是在我工作的地方是如何工作的,如果你确实认为这是真的需要,我可以翻译代码)。

我有什么想法来测试这个课程?


你不能伪造原始的POST数据。 但问题在于你的代码:它不是单元测试的。 代替:

if (filter_input(INPUT_POST,'name',FILTER_UNSAFE_RAW) && filter_input(INPUT_POST,'age', FILTER_VALIDATE_INTEGER)) {
    $url = filter_input(INPUT_POST,'url',FILTER_SANITIZE_URL);
}

如果你有:

if (filter_var($data['name'], FILTER_UNSAFE_RAW) && filter_var($data['age'], FILTER_VALIDATE_INT)) {
    $url = filter_var($data['url'], FILTER_SANITIZE_URL);
}
// where $data is a copy of $_POST in that case

会使您的代码单元可测试,并且与您以前的代码完全相同。

PS:FILTER_VALIDATE_INTEGER无效。 适当的常量是FILTER_VALIDATE_INT


你的代码有两个问题。 一个是你正在访问难以测试的全局变量。 第二个是你将这个类与特定的数据紧密结合(post,get等)。

你应该做的是让这个类满足这种接口:

$filter = new Filter($_POST);
$filter->validate_string('name');

好处应该是显而易见的。 您不必使用$_POST$_GET或任何其他预定义类型作为输入。 您现在不仅可以验证来自任何源的输入(因为您只是将它传递给构造函数),更重要的是,您可以将任何数据注入您喜欢的用于测试目的的数据。

Woops,我错过了关于使用filter_input的部分。 解决方法是使用filter_var 。 它允许你在任何变量上运行过滤器。

链接地址: http://www.djcxy.com/p/48865.html

上一篇: How to make a PHPUnit test that depends on ~real~ POST/GET data?

下一篇: Optimal population size, mutate rate and mate rate in genetic algorithm