如何使用phpunit和Laravel进行实际的文件上传,这不是假的

时间:2018-11-05 13:03:06

标签: laravel-5 phpunit

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());

然后,我在显示的最后一行出现空错误。

在我承认自己在黑暗中刺伤之前,从未做过这种事情。任何帮助将不胜感激。

1 个答案:

答案 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的更多信息。