在代码中将文件发送到Restful服务

时间:2015-02-10 17:09:07

标签: rest testing laravel codeception laravel-5

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

我试着跑:

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

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

  

[PHPUnit_Framework_ExceptionWrapper]上传的文件必须是UploadedFile的数组或实例。

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

我也在使用Postman插件Google Chrome测试API,我可以使用此插件上传文件而不会出现问题。

5 个答案:

答案 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)

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

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