在 codeception 中将文件发送到 Restful 服务

Send file to Restful service in codeception

我想测试 restful API 文件上传测试。

我尝试 运行:

 $I->sendPOST($this->endpoint, $postData, ['file' => 'example.jpg']);

我希望它的行为与用户在名称为 file 的文件输入中发送的 example.jpg 文件相同,但它似乎无法以这种方式工作。我得到:

[PHPUnit_Framework_ExceptionWrapper] An uploaded file must be an array or an instance of UploadedFile.

是否可以在代码接收中使用 REST 插件上传文件?文档非常有限,很难说如何去做。

我也在测试 API 使用 Postman 插件到 Google Chrome,我可以使用这个插件毫无问题地上传文件。

经过测试似乎可以正常工作,我们需要使用 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]);

我最近一直在努力解决同样的问题,发现有另一种方法可以在不使用 Symfony 的 UploadedFile class 的情况下解决问题。您只需要以与 $_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'),
        ]
    ]
);

希望这对某人有所帮助并防止检查框架的源代码(我被迫这样做,因为文档跳过了如此重要的细节)

['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]);

下面为我自己工作,

在服务器上:

$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') ]);

@Yaronius 的回答在我从测试中删除以下 header 后对我有用:

$I->haveHttpHeader('Content-Type', 'multipart/form-data');