我的phpunit集成测试有点问题,我有一种方法可以处理视频文件上传的表单以及该视频的预览图像。<<<<<<<<<<<<<</p>
public function store($request)
{
/** @var Video $resource */
$resource = new $this->model;
// Create a new Content before creating the related Photo
$contentRepo = new ContentRepository();
$content = $contentRepo->store($request);
if($content->isValid()) {
$resource->content_id = $content->id;
$directory = 'frontend/videos/assets/'.date("Y").'/'.date('m').'/'.time();
File::makeDirectory($directory, 0755, true);
$request->video->move($directory.'/', $request->video->getClientOriginalName());
$resource->video = '/'.$directory.'/'.$request->video->getClientOriginalName();
$request->preview_image->move($directory.'/', $request->preview_image->getClientOriginalName());
$resource->preview_image = '/'.$directory.'/'.$request->preview_image->getClientOriginalName();
$resource->highlighted = intval($request->input('highlighted') == 'on');
$resource->save();
return $resource;
}
else {
return $content;
}
}
要保留的重要部分是$request->video->move()
调用,我可能需要替换以使用虚拟文件系统。
,然后测试
public function testVideoUpload(){
File::put(__DIR__.'/frontend/videos/assets/image.mp4', 'test');
$file = new UploadedFile(__DIR__.'/frontend/videos/assets/image.mp4', 'foofile.mp4', 'video/mp4', 100023, null, $test=true);
File::put(__DIR__.'/frontend/images/assets/image.jpg', 'test');
$preview = new UploadedFile(__DIR__.'/frontend/images/assets/image.jpg', 'foofile.jpg', 'image/jpeg', 100023, null, $test=true);
$this->post('/admin/videos', [
'title' => 'My Video #12',
'description' => 'This is a description',
'actors' => [$this->actor->id, $this->actor2->id],
'scenes' => [$this->scene->id, $this->scene2->id],
'payment_methods' => [$this->paymentMethod->id],
'video' => $file,
'preview_image' => $preview
])->seeInDatabase('contents', [
'title' => 'My Video #12',
'description' => 'This is a description'
]);
}
如您所见,我需要在某些本地目录中创建一个虚拟文件,然后在http请求中使用该文件到表单的端点,然后将其移动,我需要删除创建的文件夹和新移动的文件...这是真实的混乱。
因此,我想改用虚拟文件系统,但是我不知道如何在这种特殊情况下设置它,我已经下载了一个包并设置了它,但是问题首先是哪个包裹有哪个软件包您使用/推荐,如何调整课程和测试以支持虚拟文件系统?我是否需要切换到使用存储立面而不是$request->video->move()
调用?如果是这样,那将如何完全完成?
预先感谢您的帮助
我无法弄清VFS系统,但是我确实有一个替代方案仍然有点混乱,但是完成了工作。
基本上,我在phpunit base类上设置了两种方法,以设置和拆除需要它们的任何测试所需的临时文件夹,因为我使用的是数据库交易,在每个测试运行中都会删除文件,我需要创建文件每次我运行测试时,新的虚拟文件都会提交。
所以我有两种方法setupTempDirectories
和teardownTempDirectories
,我将在需要这些临时目录的每个测试的开始和结束时调用。
我将温度文件放在存储目录中,因为有时我通过phpstorm单独运行测试,而__DIR__
命令会混乱,当我这样做时指向不同的目录,我也尝试了__FILE__
,也尝试了相同的结果,所以我只是求助于使用Laravel的storage_path
,这很好。
然后,这留下了我的具体类的问题,该类别试图移动文件并在公共文件夹中创建目录...因此,为了修复我更改代码以使用存储立面,然后我模拟了我的测试中的存储立面
所以在我的混凝土类中
$directory = 'frontend/videos/assets/'.date("Y").'/'.date('m').'/'.time();
Storage::makeDirectory($directory, 0755, true);
Storage::move($request->video, $directory . '/' . $request->video->getClientOriginalName());
$resource->video = '/'.$directory.'/'.$request->video->getClientOriginalName();
Storage::move($request->preview_image, $directory . '/' . $request->preview_image->getClientOriginalName());
$resource->preview_image = '/'.$directory.'/'.$request->preview_image->getClientOriginalName();
然后在我的测试中,我同时模拟了makeDirectory
和move
的方法
// Override the Storage facade with a Mock version so that we don't actually try to move files around...
Storage::shouldReceive('makeDirectory')->once()->andReturn(true);
Storage::shouldReceive('move')->twice()->andReturn(true);
这使我的测试工作起作用,并且在完成后实际上不会抛弃文件……我希望有人有更好的解决方案,但暂时是我想到的。我实际上是在尝试使用VF,但从未解决过...我一直遇到storage
目录中原始文件即使它在那里也找不到的错误...
我什至不确定存储外墙在后台使用VF,即使应该...