I have written an action which create a temporary file and returned it with a BinaryFileResponse
and delete it after.
Something like this :
$response = new BinaryFileResponse($this->getFile($filename) );
$response->deleteFileAfterSend(true);
$response->headers->set('Content-Type', $this->getFileMimeType($filename));
return $response;
Where $filename
refers to a temporary file.
It’s working great, my file is sent and deleted after. But I cannot test it.
Here the summary of my test :
public function testIndex()
{
$client = static::createClient();
$crawler = $client->request('GET', '/post');
$response = $this->client->getResponse();
if($response instanceof SymfonyComponentHttpFoundationBinaryFileResponse )
{
$fullpath = '/some/path/filename';
$this->assertFileEquals($fullpath, $response->getFile()->getPathname());
}
}
But during the time of the test the file has already been deleted…
jerome@api $ phpunit -c .
PHPUnit 5.7.27 by Sebastian Bergmann and contributors.
F
Time: 3.08 seconds, Memory: 30.25MB
There was 1 failure:
1) TestsCoreBundleControllerExperienceControllerTest::testAPICall
Failed asserting that file "/Users/jerome/Developpement/api/app/../var/cache/experience_file_15b5ae9bc7f668" exists.
I have found bug request on the symfony github but no solution yet. Any idea of how I can achieve this ?
My ideas so far :
1 Remove deleteFileAfterSend
depending on the environment, but I found this solution quit ugly.
2 Stop using WebTestCase
and start using cURL but I don’t want to lose code coverage and it seems to be a lot of work.
Advertisement
Answer
I finally found a solution, I just send the file without using BinaryFileResponse
.
$headers = array(
'Content-Type' => 'image/png',
'Content-Disposition' => 'inline; filename="image.png"');
return new Response(file_get_contents('myFile.png'), 200, $headers);
To delete the file after sending, just save the result of file_get_contents
in a variable and delete the file, then send the response.
For testing, it’s really easy :
$fileContent = file_get_contents($filepath);
$this->assertEquals($response->getContent(),$fileContent,"File content doesn't match requirement");