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() );


 }


}



原作者:
...