2010-07-11 10 views
17

Ich versuche, einen Komponententest für einen Controllerwie überschreibe ich php: // input wenn Unit-Tests zu tun

I-Daten erhalten von PHP in dem Code mit Zend und PHPUnit zu schreiben: // input

Mein Code funktioniert gut, wenn ich die reale Anwendung teste, aber wenn ich Daten nicht als roher HTTP-Post liefern kann, sind $ data immer leer. Die Methode getRawBody() ruft file_get_contents ('php: // input') auf, aber wie überschreibe ich diese, um die Testdaten an meine Anwendung zu liefern.

Antwort

3

Sofern der $req->getRawBody() ist, wie Sie sagen, das gleiche wie file_get_contents('php://input') ...

$test = true; /* Set to TRUE when using Unit Tests */ 

$req = new Zend_Controller_Request_Http(); 
if($test) 
    $data = file_get_contents('testfile.txt'); 
else 
    $data = $req->getRawBody(); 

keine perfekte Lösung, aber ähnlich dem, was ich in der Vergangenheit verwendet haben, wenn Scripts Gestaltung verrohrt E-Mails zu handhaben mit großer Erfolg.

+0

Yeap, keine perfekte Lösung, aber wie ich beschlossen habe, es auch umzusetzen. Vielen Dank. –

+0

Ich würde diese Lösung nicht empfehlen - Verwenden von 'if'-Anweisungen, um anderen Code in Komponententests im Vergleich zur Produktion auszuführen. Sie möchten idealerweise, dass Ihr Code in beiden Welten die gleichen logischen Anweisungen ausführt. Siehe unten die Lösung von @ MitMaro, die einen konfigurierbaren Eingangspfad verwendet. –

7

Sie könnten versuchen, das Objekt in Ihren Komponententests zu verspotten. Etwas wie folgt aus:

$req = $this->getMock('Zend_Controller_Request_Http', array('getRawBody')); 
$req->method('getRawBody') 
    ->will($this->returnValue('raw_post_data_to_return')); 
+0

also würde dies funktionieren, wenn ich Zend_Controller_Request_Http Objekt in den Code übergeben würde, den ich gerade getestet habe, der Controller behandelt all dies unter der Haube. Ich denke, der einzige Weg, dies zu tun, besteht darin, meine Anwendung zu ändern, um auf die Umgebung, in der ich mich befinde, zu testen und den speziellen Fall zu behandeln. –

10

hatte ich das gleiche Problem und die Art, wie ich regelte es war die 'php://input' Zeichenfolge als eine Variable zu haben, die während der Laufzeit einstellbar ist. Ich weiß, dass dies nicht direkt auf diese Frage zutrifft, da es das Zend Framework modifizieren müsste. Aber trotzdem kann es für jemanden hilfreich sein.

Zum Beispiel:

<?php 
class Foo { 

    public function read() { 
     return file_get_contents('php://input'); 
    } 
} 

würde

<?php 
class Foo { 

    public $_fileIn = 'php://input'; 

    public function read() { 
     return file_get_contents($this->_fileIn); 
    } 

} 

Dann in meinem Unit-Test ich tun kann:

<?php 
$obj = new Foo(); 
$obj->_fileIn = 'my_input_data.dat'; 
assertTrue('foo=bar', $obj->read()); 
+2

Sie könnten auch eine geschützte Eigenschaft haben und diese durch Reflektion in den Tests öffentlich machen. Also für die Produktion ist Ihr Code ein wenig sauberer. (Angenommen, PHP 5.3) – edorian

0

Zend_Controller_Request_HttpTestCase enthalten Methoden zur Einstellung und verschiedene HTTP-Anfrage bekommen/Antworten.

Zum Beispiel: $req = new Zend_Controller_Request_HttpTestCase; $req->setCookie('cookie', 'TRUE'); $test = $this->controller->cookieAction($req); $this->assertSame($test, TRUE);

Verwandte Themen