我写了一个动作,创建一个临时文件,并返回一个BinaryFileResponse
,然后删除它。就像这样:
$response = new BinaryFileResponse($this->getFile($filename) );
$response->deleteFileAfterSend(true);
$response->headers->set('Content-Type', $this->getFileMimeType($filename));
return $response;
其中$filename
是指临时文件。
它的工作很好,我的文件被发送和删除后.但我不能测试它。
以下是我的测试总结:
public function testIndex()
{
$client = static::createClient();
$crawler = $client->request('GET', '/post');
$response = $this->client->getResponse();
if($response instanceof \Symfony\Component\HttpFoundation\BinaryFileResponse )
{
$fullpath = '/some/path/filename';
$this->assertFileEquals($fullpath, $response->getFile()->getPathname());
}
}
但在测试期间文件已被删除...
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) Tests\CoreBundle\Controller\ExperienceControllerTest::testAPICall
Failed asserting that file "/Users/jerome/Developpement/api/app/../var/cache/experience_file_15b5ae9bc7f668" exists.
我在symfony github上发现了bug请求,但还没有解决方案。你知道我该怎么做吗?
到目前为止我的想法:
1根据环境删除deleteFileAfterSend
,但我发现这个解决方案很难看。2停止使用WebTestCase
,开始使用cURL,但我不想失去代码覆盖率,这似乎是一个很大的工作。
2条答案
按热度按时间bjp0bcyl1#
Symfony的测试客户端在内部存储控制器动作的输出。你可以用这个做测试。
o3imoua42#
我终于找到了一个解决方案,我只是发送文件,而不使用
BinaryFileResponse
。要在发送后删除文件,只需将
file_get_contents
的结果保存在变量中并删除文件,然后发送响应。对于测试,这真的很容易: