流明文件上传测试:请求中不存在文件

Posted

技术标签:

【中文标题】流明文件上传测试:请求中不存在文件【英文标题】:Lumen file upload testing: file is not present on the request 【发布时间】:2018-12-15 00:23:39 【问题描述】:

我正在尝试在 Lumen 5.6 中测试文件上传,但 Illuminate\Http\UploadedFile fake 没有通过我的控制器中的检查。例如:

测试:

use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;

public function testUploadImage()

    Storage::fake('s3');

    $this->actingAs($this->user)
        ->post('/v1/files', [
            'file1' => UploadedFile::fake()->image('avatar.jpg'),
        ])
        ->seeJsonStructure([
            'file1' => [
                'filename',
                'mime',
            ],
        ])
        ->assertResponseStatus(201);

    ...

控制器:

public function upload(Request $request)

    $this->validate($request, [
        'file1' => 'required|file|mimetypes:image/jpeg',
    ]);

    // Temp check
    if (!$request->hasFile('file1')) 
        echo 'no file';
    

    $filename = $request->file('file1')->hashName();
    $mime = $request->file('file1')->getMimeType();

    Storage::disk('s3')
        ->putFile(
            $this->getFolderByMime($mime),
            $request->file('file1'),
            'public'
        );

    return $this->respond([
        'file1' => [
            'filename' => $filename,
            'mime' => $mime,
        ]
    ]);

验证通过,但$request->hasFile('file1') 始终返回false

附:我使用 Amazon S3 来存储文件。

【问题讨论】:

【参考方案1】:

在 Lumen 中,文件参数被硬编码为空。 See Github issue.

这是因为文件参数传递给调用 post调用中的方法被硬编码为一个空数组。

您需要按如下方式构造调用:

$this->actingAs($this->user)
    ->post('/v1/files', [], [], [
        'file1' => UploadedFile::fake()->image('avatar.jpg'),
    ])
    ->seeJsonStructure([
        'file1' => [
            'filename',
            'mime',
        ],
    ])
    ->assertResponseStatus(201);

【讨论】:

以上是关于流明文件上传测试:请求中不存在文件的主要内容,如果未能解决你的问题,请参考以下文章

Jmeter 接口测试-文件上传报“文件不存在”问题解决

requests请求接口---上传文件

上传文件springboot所需的请求部分“文件”不存在

春季文件上传 - '所需的请求部分不存在'

上传下载文件接口测试

Python接口测试,requests库的post请求进行文件上传