others - PHP - 在真实场景中,如何制作一个依赖于PHPUnit的POST/GET数据测试?

63 3

我创建了一个PHP类,该类封装了filter_input函数,
要使用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数据,

我尝试使用下面的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

时间: 原作者:

123 3

你不能伪造原始数据,


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



P.S.:FILTER_VALIDATE_INTEGER无效。 正确的常量是FILTER_VALIDATE_INT

原作者:
99 0

你的代码有2个问题,一种是访问全局变量,这些变量很难测试,第二种是你将类紧密绑定到了特定的数据(post ,get等)。

你应该做让类满足类型的接口:


$filter = new Filter($_POST);


$filter->validate_string('name');



好处应该是明显的,你不必将$_POST$_GET或其他预定义类型作为输入,

原作者:
85 0

一种方法是使用helper方法在内部运行filter_input,然后在测试期间模拟此方法以便使用其他类似于filter_var的方法。

例如,可以通过执行以下操作来完成此用例:


class Data_Class {



 protected function i_use_filters() {


 if ( $this->filter_input( 'name', FILTER_UNSAFE_RAW ) && $this->filter_input( 'age', FILTER_VALIDATE_INT ) ) {


 $url = $this->filter_input( 'url', FILTER_SANITIZE_URL );


 }


 return $url;


 }



 protected function filter_input( $name, $filter ) {


 return filter_input( INPUT_POST, $name, $filter );


 }


}



class Test_Class extends TestCase {



 public function test_filters() : void {


 $mock = $this->getMockBuilder( Data_Class::class )


 ->setMethods( [ 'filter_input' ] )


 ->getMock();


 $mock->method( 'filter_input' )


 ->willReturnCallback( function ( $name, $filter ) {


 if ( ! isset( $_POST[ $name ] ) ) {


 return null;


 }


 return filter_var( $_POST[ $name ], $filter );


 } );



 $_POST[ 'name' ] = 'Myself';


 $_POST[ 'age'] = 40;


 $_POST[ 'url' ] = 'https://test.com';



 $this->assertEquals( 'https://test.com', $mock->i_use_filters() );


 }


}



原作者:
...