Phpunit,Laravel 5.5 如何使用phpunit和Laravel模拟而不是伪造的实际文件上传。我最近的刺是这样的。来自单元测试:
$handle = fopen($path,'r');
$content = fread($handle,2048);
fclose($handle);
$fdata = [
'delimiter' => '3',
'id' => 1,
'allow_shared_roles' => 'on',
'file'=>$name
];
$this->call('POST','/event/add-wizard/2',$fdata,[],[],[
'Content-Length'=>strlen($content),
'Content-Type'=>'multipart/form-data;boundary='.$content,
'Content-Disposition'=>'form-data;name="file";filename="'.$name.'"'
],$content);
然后在服务器端,这是我挂断的地方。
if ($request->hasFile('file')) {
$input['extension'] = strtolower($request->file('file')->getClientOriginalExtension());
}
$validator = \Validator::make($input, ['file' => 'required', 'extension' => 'in:csv', 'delimiter' => 'required'], ['extension.in' => 'The file must be a .csv file.']);
if ($validator->fails()) {
return \Redirect::back()->withInput()->withErrors($validator);
}
if (!file_exists(storage_path('temp-files'))) {
\File::makeDirectory(storage_path('temp-files'));
}
$date = \Carbon\Carbon::now();
$tmpFile = $request->file('file')->move(storage_path('temp-files'), $date->format('YmdHis') . '_' . $request->file('file')->getClientOriginalName());
然后,我在显示的最后一行出现空错误。
在我承认自己在黑暗中刺伤之前,从未做过这种事情。任何帮助将不胜感激。
答案 0 :(得分:0)
在注释中确认要检查是否遵循上传例程,而不是真正上传文件后,可以模拟外观File
,以查看是否调用了方法并使用了正确的参数(可选)
要在Laravel中模拟外观,可以使用shouldReceive('method_name')
中的构建方法。您可以根据自己的情况在通话之前添加以下内容:
// should create new directory
File::shouldReceive('makeDirectory')
->once();
// should move the uploaded file to the dir
File::shouldReceive('move')
->once()
->andReturn( $fake_file );
您可以了解有关模拟立面here的更多信息。