使用 Laravel Medialibrary "The current request does not have a file in a key named" 测试 S3 上传

Testing S3 upload with Laravel Medialibrary "The current request does not have a file in a key named"

我正在编写一个功能测试,用于使用 Laravel Medialibrary 将简单的照片上传到 S3。

这是测试:

/** @test */
public function a_user_can_upload_a_photo()
{
    $this->withoutExceptionHandling();

    Storage::fake('s3');

    $user = factory(User::class)->create();

    $this->signIn($user);

    $this->post( route('users.update.photo', [
        $user,
        'photo' => UploadedFile::fake()->image('photo.jpeg', 500, 500)->size(1000),
    ]));

    $this->assertEquals(1, Media::all()->count());

    Storage::disk('s3')->assertExists('photo.jpeg');
}

这是处理上传的控制器方法的相关部分:

public function uploadPhoto(User $user, Request $request)
{

    // ...

    try {
        $user->addMediaFromRequest('photo')
            ->preservingOriginal()
            ->toMediaCollection('user-photo');

    } catch (\Exception $e) {
        dd($e);
        Log::debug('User photo upload: ' . $e);

    }

    return redirect(route('users.edit.profile', $user));
}

dd($e) 捕获的错误是

当前请求在名为 photo

的键中没有文件

我实际上可以通过将错误消息放在 try-catch 前面来测试错误消息是否正确:

dd($request->has('photo')); ===

但是

dd($request->hasFile('photo')); ===

所以我显然没有将我的模拟文件作为文件正确附加到请求,但我不知道该怎么做,我的在线搜索中的每个示例都建议按照我已经做的方式进行测试。

非常感谢任何帮助。

post() 方法需要 url 作为第一个参数,数据作为第二个参数。

您正在使用助手 route() 生成 url,它需要您要编辑的用户作为参数,但您也将文件数据作为参数传递给助手route(),而不是将其作为参数传递给 post() 方法:

$this->post( // just one argument for the post method
    route('users.update.photo', [ // and two parameters for the route helper
        $user,
        'photo' => UploadedFile::fake()->image('photo.jpeg', 500, 500)->size(1000),
    ])
);

因此使用此语法将文件作为 post() 方法的第二个参数传递:

$this->post( 
    route('users.update.photo', ['user' => $user]), // first argument
    [ 'photo' => UploadedFile::fake()->image('photo.jpeg', 500, 500)->size(1000) ]  // second argument
);