How to retrieve a streamed response (e.g. download a file) with Symfony test client

前端 未结 3 2002
一生所求
一生所求 2021-01-17 10:02

I am writing functional tests with Symfony2.

I have a controller that calls a getImage() function which streams an image file as follows:



        
相关标签:
3条回答
  • 2021-01-17 10:23

    The return value of sendContent (rather than getContent) is the callback that you've set. getContent actually just returns false in Symfony2

    Using sendContent you can enable the output buffer and assign the content to that for your tests, like 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();
    

    You can read more on the output buffer here

    The API for StreamResponse is here

    0 讨论(0)
  • 2021-01-17 10:27

    The current best answer used to work well for me for some time, but for some reason it isn't anymore. The response is parsed into a DOM crawler and the binary data is lost.

    I could fix that by using the internal response. Here's the git patch of my changes[1]:

    -        ob_start();
             $this->request('GET', $uri);
    -        $responseData = ob_get_clean();
    +        $responseData = self::$client->getInternalResponse()->getContent();
    

    I hope this can help someone.

    [1]: you just need access to the client, which is a Symfony\Bundle\FrameworkBundle\KernelBrowser

    0 讨论(0)
  • 2021-01-17 10:30

    For me didn't work like that. Instead, I used ob_start() before making the request, and after the request i used $content = ob_get_clean() and made asserts on that content.

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

    Maybe this was because my response is a csv file.

    In controller:

        $response->headers->set('Content-Type', 'text/csv; charset=utf-8');
    
    0 讨论(0)
提交回复
热议问题