2015-05-08 8 views
12

Probleme mit PHPUnit, um meine Controller zu testen.

-Code ich arbeitete bisher wurde die Umsetzung $_POST oder andere Anfrage Variablen:

$_SERVER['REQUEST_METHOD'] = 'POST'; 
$_POST = array(
    'test' => true 
); 

Die meisten Tests funktionierte perfekt auf diese Weise, bis ich in die Methoden ausführen, die Verwendung von filter_input_array Funktion übernehmen:

$_SERVER['REQUEST_METHOD'] = 'POST'; 
$_REQUEST = $_POST = $GLOBALS['_POST'] = array(
    'test' => true 
); 

// .... 

var_dump(filter_input_array(INPUT_POST)); 

NULL

Ich bin nicht bereit, filter_input Funktionen aus nicht meins Code zu entfernen, aber ich bin nicht in der Lage, sie in Tests arbeiten zu lassen.

Versionings:
PHP 5.5.9-1ubuntu4.9 (cli) (gebaut: 17. April 2015 11.44.57)
Apache/2.4.7 (Ubuntu)
PHPUnit 4.6.6 durch Sebastian Bergmann und Mitwirkende.

Jede Hilfe wird geschätzt.

EDIT 2015.05.11

Einstellung $_SERVER mit CONTENT_LENGTH und CONTENT_TYPE das Problem nicht beheben. Meine Version von PHP erlaubt mir nicht zu schreiben php://stdin in der Weise in PHP 5.6.0 chagelog (oder wie ich es verstehe), aber file_put_contents(STDIN,..) gelingen, aber funktioniert sowieso nicht.

Da es ein PHP-Test ist, gibt es vielleicht eine Art von Anmerkung oder phpunit.xml Eintrag, den ich noch nicht kenne, der dieses Problem in php-cgi POST setting Weise beheben kann.

+0

Ihre zwei Beispiele '$ _POST' anders zuweisen. Was sind die Werte der drei Variablen '$ _REQUEST',' $ _POST' und '$ GLOBALS ['_ POST']' * vor * Sie tun '$ _REQUEST = $ _POST = $ GLOBALS ['_ POST']'? –

+0

Ihre leeren Arrays. Da es sich um einen PHP-Test handelt, läuft es in der Kommandozeile (php-cli), so dass es nicht einmal einen Webserver gibt und keine '$ _REQUEST'-bezogenen Variablen gesetzt werden sollten. Ich habe Unit-Tests von PHP selbst angeschaut, wie sie 'filter_input_array' testen, aber es hat mir überhaupt nicht geholfen. – yergo

+0

werfen Sie einen Blick auf http://stackoverflow.com/questions/5655284/how-to-pass-parameters-from-command-line-to-post-in-php-script es kann helfen? – exussum

Antwort

9

Wenn der Eingang zu filter_input_array kann nur durch die anfängliche Anforderung eingestellt wird, und zur Laufzeit nicht verändert, dann ist der einzige Weg, um es noch zu testen, ist eine Ihres Basis-Test-Proxy auf einem anderen Test-Skript zu haben, ein, indem HTTP-Anfrage mit den richtigen POST-Daten und Verarbeitung der Antwort.

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"; 
} 
+0

Daumen hoch für den Vorschlag "Curl". Es ist Workaround, aber scheint zu funktionieren. Kannst du auch deinen proxy_test bearbeiten ('$ test_name =')? –

+0

Sieht nach einer Möglichkeit aus, dies zu tun. Werde versuchen. Leider wird es wahrscheinlich keine Code-Abdeckung in der Konfiguration bieten, die ich aktuell habe, aber für den Moment kann ich ohne das leben. – yergo

5

Es scheint, dass dies eine Einschränkung von PHP ist, filter_input_array() erlaubt keine $_POST Array zur Laufzeit geändert. Weitere Informationen finden Sie unter this bug. Die Problemumgehung besteht wahrscheinlich darin, einen der the other filter functions zu verwenden und das $_POST Array selbst zu übergeben.

+0

Sieht so aus, als wäre providen Bug weiterhin vorhanden, da die Funktion NULL anstelle von false oder leerem Array zurückgibt. Wie auch immer, ich denke, dass es möglich ist, diesen Test in phpunit auszuführen, da dieses Tool laufende Skripte in separaten Prozessen bereitstellt und ich eine SO-Antwort lieferte, die beweist, dass POST beim Skriptstart möglich ist. Ich habe gerade keinen Workaround für meinen Fall gefunden. – yergo

1

Wenn keines der Argumente gesetzt ist, gibt diese Funktion NULL, not an array of NULL values.

// Kein POST Vars Anfrage

$_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 } 
gesetzt

tatsächlichen Ausgang: NULL

Während Filtern Sie Input-Arrays, seien Sie vorsichtig, welche Flags Sie neben FILTER_REQUIRE_ARRAY setzen. Zum Beispiel der Einstellung der Flags wie so:

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

.. in einem leeren $ form_inputs führen wird [ 'myInputArr'], unabhängig von was $ _POST [ 'myInputArr'] enthält.

+1

Sorry, wenn ich nicht folgen kann, aber wie hilft mir das bei meiner Frage? – yergo