Laravel 5.4中PHPUnit测试的虚拟文件系统
我的PHPUnit集成测试有点问题,我有一个方法可以处理视频文件的表单上传以及视频的预览图像Laravel 5.4中PHPUnit测试的虚拟文件系统,phpunit,laravel-5.4,virtualfilesystem,Phpunit,Laravel 5.4,Virtualfilesystem,我的PHPUnit集成测试有点问题,我有一个方法可以处理视频文件的表单上传以及视频的预览图像 public function store($request) { /** @var Video $resource */ $resource = new $this->model; // Create a new Content before creating the related Photo $contentRepo = new ContentReposit
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基类上设置了两个方法来设置和拆除任何需要临时文件夹的测试,因为我使用的是数据库事务,每次测试运行时文件都会被删除,每次运行测试时我都需要创建新的虚拟文件 因此,我有两种方法
setupTempDirectories
和teardownTempDirectories
,我将在需要这些临时目录的每个测试开始和结束时调用它们
我将临时文件放在存储目录中,因为有时我会通过PHPStorm单独运行测试,\uuuuuu DIR\uuuuu
命令出错,并指向不同的目录,我也尝试了\uuuu FILE\uuuuu
,结果相同,因此,我只是求助于使用Laravel的存储路径
,效果很好
这就剩下了我的具体类的问题,它试图移动文件并在公用文件夹中为它们创建目录。。。因此,为了解决这个问题,我将代码更改为使用存储外观,然后在测试中模拟存储外观
所以在我的混凝土课上
$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);
这使我的测试工作,并没有真正留下文件后,它完成了…我希望有人有一个更好的解决方案,但目前这是我想出的。
我实际上试着使用VFS,但一直没有成功。。。我不断收到错误,即存储
目录中的原始文件找不到,即使它就在那里
我甚至不确定Storage facade一开始是否在后台使用VFS,尽管它应该