php - PHP - 在phpunit測試中,為filter_input_array(INPUT_POST)設置$_POST

71 5

使用PHPUnit測試控制器時遇到一些問題。


$_SERVER['REQUEST_METHOD'] = 'POST';


$_POST = array(


 'test' => true


);



在使用filter_input_array函數的方法之前,大多數測試都是這樣工作的:


$_SERVER['REQUEST_METHOD'] = 'POST';


$_REQUEST = $_POST = $GLOBALS['_POST'] = array(


 'test' => true


);



// ....



var_dump(filter_input_array(INPUT_POST));



我不願意從我的代碼中刪除filter_input函數,但是我不能讓它們在測試中工作。

Versionings :
PHP 5.5.9 -1ubuntu4.9 (cli) (built : Apr 17 2015 11:44:57 )
Apache/2.4.7(Ubuntu)
PHPUnit 4.6.6 by Sebastian Bergmann and contributors .

任何幫助將十分感激。

时间: 原作者:

50 4

如果filter_input_array的輸入只能由初始請求設置,而且在運行時還沒有更改,則使用正確的POST數據對它進行測試。

main_test.php :


<?php


$data = array(


 'testname' => 'yourtestname',


 'some_post_var' => 'some_value'


);



$ch = curl_init();


curl_setopt($ch, CURLOPT_URL,"http://localhost/proxy_test.php");


curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));


curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);



$response = curl_exec($ch);



curl_close($ch);



if ($response == 'pass') {


 // test passed


}



proxy_test.php


<?php


$test_name $_POST['testname']; // what test to run?


$response = run_test($test_name); // run test that uses filter_input_array


if ($response) {


 echo"pass"; // used by main_test.php to check if test passed


} else {


 echo"fail";


}



原作者:
50 4

這似乎是PHP的一個限制,filter_input_array()不允許在運行時修改$_POST數組,解決方法可能是使用其他篩選函數,然後自己傳遞$_POST數組。

原作者:
65 5

如果未設置參數,則此函數返回NULLnot an array of NULL values.

//沒有在請求中設置過POST


$_POST = array();


$args = array('some_post_var' => FILTER_VALIDATE_INT);


$myinputs = filter_input_array(INPUT_POST, $args);


var_dump($myinputs);



Expected Output: array(1) { ["some_post_var"]=> NULL } 



實際輸出:NULL

在過濾輸入數組時,要注意除FILTER_REQUIRE_ARRAY之外設置的標誌,例如設置如下標誌:


 <?php 


 $filter = array( 


 'myInputArr' => array('filter' => FILTER_SANITIZE_STRING, 


 'flags' => array('FILTER_FLAG_STRIP_LOW', 'FILTER_REQUIRE_ARRAY')) 


 ); 



$form_inputs = filter_input_array(INPUT_POST, $filter); 


?> 



將導致$form_inputs['myInputArr']為空,無論$_POST['myInputArr']包含什麼。

原作者:
84 1

例如,可以通過執行以下操作來完成此用例:


class Data_Class {



 protected function i_use_filters() {


 return $this->filter_input_array();


 }



 protected function filter_input_array() {


 return filter_input_array( INPUT_POST );


 }


}



class Test_Class extends TestCase {



 public function test_filters() : void {


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


 ->setMethods( [ 'filter_input_array' ] )


 ->getMock();


 $mock->method( 'filter_input_array' )


 ->willReturnCallback( function () {


 if ( ! isset( $_POST ) ) {


 return null;


 }


 return filter_var_array( $_POST );


 } );



 $_POST['test'] = true;


 $this->assertTrue( $mock->i_use_filters()['test'] );


 }


}



原作者:
...