2013-03-31 5 views
10

Ich schreibe Funktionstests mit Symfony2.So rufen Sie eine gestreamte Antwort (z. B. eine Datei herunterladen) mit Symfony-Test-Client

Ich habe einen Controller, der eine getImage() Funktion aufruft, die einen Bilddateiströme wie folgt:

public function getImage($filePath) 
    $response = new StreamedResponse(); 
    $response->headers->set('Content-Type', 'image/png'); 

    $response->setCallback(function() use ($filePath) { 
     $bytes = @readfile(filePath); 
     if ($bytes === false || $bytes <= 0) 
      throw new NotFoundHttpException(); 
    }); 

    return $response; 
} 

In funktionellen Tests, ich versuche, den Inhalt mit dem Symfony test client anzufordern, wie folgt:

$client = static::createClient(); 
$client->request('GET', $url); 
$content = $client->getResponse()->getContent(); 

Das Problem ist, dass $content leer ist, denke ich, weil die Antwort generiert wird, sobald die HTTP-Header vom Client empfangen werden, ohne auf die Lieferung eines Datenstroms zu warten.

Gibt es eine Möglichkeit, den Inhalt der gestreamten Antwort zu erfassen, während immer noch $client->request() (oder auch eine andere Funktion) verwendet wird, um die Anfrage an den Server zu senden?

Antwort

7

Der Rückgabewert von sendContent (statt getContent) ist der Rückruf, den Sie festgelegt haben. getContent tatsächlich gibt nur falsch in Symfony2

Mit sendContent können Sie den Ausgabepuffer aktivieren und den Inhalt der für die Tests zuweisen, etwa so:

$client = static::createClient(); 
$client->request('GET', $url); 

// Enable the output buffer 
ob_start(); 
// Send the response to the output buffer 
$client->getResponse()->sendContent(); 
// Get the contents of the output buffer 
$content = ob_get_contents(); 
// Clean the output buffer and end it 
ob_end_clean(); 

Sie auf mehr lesen der Ausgangspuffer here

die API für StreamResponse ist here

+2

Für mich ist diese Arbeit zu bekommen musste ich() platzieren ob_start, bevor die Anforderung zu machen. –

6

Für mich hat so nicht funktioniert. Stattdessen habe ich ob_start() verwendet, bevor ich die Anfrage gemacht habe, und nach der Anfrage habe ich $ content = ob_get_clean() benutzt und auf diesen Inhalt bestanden.

Im Test:

// Enable the output buffer 
    ob_start(); 
    $this->client->request(
     'GET', 
     '$url', 
     array(), 
     array(), 
     array('CONTENT_TYPE' => 'application/json') 
    ); 
    // Get the output buffer and clean it 
    $content = ob_get_clean(); 
    $this->assertEquals('my response content', $content); 

Vielleicht war das, weil meine Antwort eine CSV-Datei ist.

In Controller:

$response->headers->set('Content-Type', 'text/csv; charset=utf-8'); 
+1

Danke, es funktionierte für mich auch mit einem 'Symfony \ Component \ HttpFoundation \ Response' Objekt. –

Verwandte Themen