【发布时间】:2010-11-11 19:12:51
【问题描述】:
我创建了一个包含 filter_input 函数的 PHP 类,以使我们的开发人员的生活更轻松。
要验证带有 url、name 和 age 字段的 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 superglobal。
我尝试使用以下 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 数据的方式编写代码 - 没有意义,过滤器扩展工作并且以不同的方式进行测试,您需要测试你的代码。为了给你建议如何做,你需要展示你的代码。
-
我并不是要敲你的代码,但使用 Zend_Validate 等已建立的验证类,你可能不会那么头疼。