igo*_*s07 7 php testing phpunit
我创建了一个包含filter_input函数的PHP类,以使我们的开发人员的生活更轻松.
为了验证与HTML形式url,name和age字段,代码将是这样的:
$post = Filter::POST();
if ($post->validate_string('name') && $post->validate_integer('age')) {
$url = $post->sanitize_url('url');
}
Run Code Online (Sandbox Code Playgroud)
它将是相同的:
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);
}
Run Code Online (Sandbox Code Playgroud)
好吧,我认为代码已经完成,现在我想为它创建一个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
Run Code Online (Sandbox Code Playgroud)
public function testPhpt() {
$phpt = new PHPUnit_Extensions_PhptTestCase('FilterTest_data.phpt', array('cgi' => 'php-cgi'));
$result = $phpt->run();
$this->assertTrue($result->wasSuccessful());
}
Run Code Online (Sandbox Code Playgroud)
原始代码: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);
}
Run Code Online (Sandbox Code Playgroud)
如果你有:
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
Run Code Online (Sandbox Code Playgroud)
将使您的代码单元可测试,并且与您之前的代码相同。
PS:FILTER_VALIDATE_INTEGER 无效。正确的常量是 FILTER_VALIDATE_INT