我想测试文件上传的restful API测试。
我试着跑:
$I->sendPOST($this->endpoint, $postData, ['file' => 'example.jpg']);
我希望它的行为与用户在名为example.jpg
的文件输入中发送file
文件的行为相同,但它似乎不会以这种方式工作。我得到了:
[PHPUnit_Framework_ExceptionWrapper]上传的文件必须是UploadedFile的数组或实例。
是否可以在代码中使用REST插件上传文件?文档非常有限,很难说如何做到。
我也在使用Postman
插件Google Chrome
测试API,我可以使用此插件上传文件而不会出现问题。
答案 0 :(得分:10)
最近我遇到了同样的问题,并发现在不使用Symfony的UploadedFile类的情况下还有另一种解决问题的方法。您只需要使用与$ _FILES数组相同的格式传递带有文件数据的数组。例如,这段代码非常适合我:
$I->sendPOST(
'/my-awesome-api',
[
'sample-field' => 'sample-value',
],
[
'myFile' => [
'name' => 'myFile.jpg',
'type' => 'image/jpeg',
'error' => UPLOAD_ERR_OK,
'size' => filesize(codecept_data_dir('myFile.jpg')),
'tmp_name' => codecept_data_dir('myFile.jpg'),
]
]
);
希望这可以帮助某人并阻止检查框架的源代码(我不得不这样做,因为文档会跳过这么重要的细节)
答案 1 :(得分:3)
经过测试,它似乎使它工作,我们需要使用UploadedFile
对象作为文件。
例如:
$path = codecept_data_dir();
$filename = 'example-image.jpg';
// copy original test file to have at the same place after test
copy($path . 'example.jpg', $path . $filename);
$mime = 'image/jpeg';
$uploadedFile = new \Symfony\Component\HttpFoundation\File\UploadedFile($path . $filename, $filename, $mime,
filesize($path . $filename));
$I->sendPOST($this->endpoint, $postData, ['file' => $uploadedFile]);
答案 2 :(得分:1)
['file' => 'example.jpg']
格式也有效,但该值必须是现有文件的正确路径。
$path = codecept_data_dir();
$filename = 'example-image.jpg';
// copy original test file to have at the same place after test
copy($path . 'example.jpg', $path . $filename);
$I->sendPOST($this->endpoint, $postData, ['file' => $path . $filename]);
答案 3 :(得分:0)
以下为我自己工作,
在服务器上:
$uploadedResume= $_FILES['resume_uploader'];
$outPut = [];
if (isset($uploadedResume) && empty($uploadedResume['error'])) {
$uploadDirectory = 'uploads/users/' . $userId . '/documents/';
if (!is_dir($uploadDirectory)) {
@mkdir($uploadDirectory, 0777, true);
}
$ext = explode('.', basename($uploadedResume['name']));
$targetPath = $uploadDirectory . md5(uniqid()) . '.' . end($ext);
if (move_uploaded_file($uploadedResume['tmp_name'], $targetPath)) {
$outPut[] = ['success' => 'success', 'uploaded_path' => $targetPath];
}
}
return json_encode($output);
很抱歉长描述代码:P
在测试方面:
//resume.pdf is copied in to tests/_data directory
$I->sendPOST('/student/resume', [], ['resume_uploader' => codecept_data_dir('resume.pdf') ]);
答案 4 :(得分:0)
$I->haveHttpHeader('Content-Type', 'multipart/form-data');