2013-03-31 9 views
10

Piszę testy funkcjonalne z Symfony2.Jak odzyskać odpowiedź strumieniową (np. Pobrać plik) za pomocą klienta testowego Symfony

Mam kontroler, który wywołuje getImage() funkcję, która strumieni plik obrazu w następujący sposób:

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; 
} 

W testów funkcjonalnych, staram się zwrócić treść z Symfony test client następująco:

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

Problem polega na tym, że $content jest pusty, ponieważ odpowiedź jest generowana, gdy tylko nagłówki HTTP są odbierane przez klienta, bez oczekiwania na dostarczenie strumienia danych.

Czy istnieje sposób na przechwytywanie zawartości przesyłanej odpowiedzi przy jednoczesnym użyciu funkcji $client->request() (lub nawet innej funkcji) w celu wysłania żądania do serwera?

Odpowiedz

7

Wartość zwracana sendContent (zamiast getContent) to ustawione przez Ciebie wywołanie zwrotne. getContent właściwie tylko zwraca fałszywe w Symfony2

Korzystanie sendContent można włączyć bufor wyjściowy i przypisać treści, które dla swoich badań, tak jak poniżej:

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

można przeczytać więcej na bufor wyjściowy here

API dla StreamResponse jest here

+2

Dla mnie to do pracy musiałem umieścić ob_start() przed złożeniem wniosku. –

6

Dla mnie nie działa tak. Zamiast tego użyłem ob_start() przed wysłaniem żądania, a po żądaniu użyłem $ content = ob_get_clean() i utworzyłem potwierdzenia dla tej treści.

W teście:

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

Może to dlatego, że moja odpowiedź jest plik CSV.

W sterowniku:

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

Dzięki, zadziałało dla mnie również przy użyciu obiektu 'Symfony \ Component \ HttpFoundation \ Response'. –

Powiązane problemy