18

Symfony2 で機能テストを書いています。

getImage()次のように、画像ファイルをストリーミングする関数を呼び出すコントローラーがあります。

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

機能テストでは、次のようにSymfony テスト クライアントでコンテンツをリクエストしようとします。

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

問題は、それ$contentが空であることです。データ ストリームが配信されるのを待たずに、クライアントが HTTP ヘッダーを受信するとすぐに応答が生成されるためだと思います。

$client->request()リクエストをサーバーに送信するために(または他の機能を)使用しながら、ストリーミングされたレスポンスのコンテンツをキャッチする方法はありますか?

4

3 に答える 3

10

私にとっては、そのようには機能しませんでした。代わりに、リクエストを行う前に ob_start() を使用し、リクエスト後に $content = ob_get_clean() を使用してそのコンテンツをアサートしました。

テスト中:

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

たぶんこれは、私の応答が csv ファイルであるためです。

コントローラーで:

    $response->headers->set('Content-Type', 'text/csv; charset=utf-8');
于 2015-05-26T10:12:54.500 に答える