Php 使用Laravel Medialibrary测试S3上传;当前请求的密钥中没有名为“0”的文件;

Php 使用Laravel Medialibrary测试S3上传;当前请求的密钥中没有名为“0”的文件;,php,laravel,testing,media-library,Php,Laravel,Testing,Media Library,我正在为使用Laravel媒体库上传到S3的简单照片编写一个功能测试 这就是测试: /** @test */ public function a_user_can_upload_a_photo() { $this->withoutExceptionHandling(); Storage::fake('s3'); $user = factory(User::class)->create(); $this->signIn($user);

我正在为使用Laravel媒体库上传到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'))==错误

显然,我没有将我的模拟文件作为文件正确地附加到请求中,但我不知道如何执行该操作,我的在线搜索中的每个示例都建议以我已经采用的方式进行测试

非常感谢您的帮助。

方法要求url作为第一个参数,数据作为第二个参数

您正在使用帮助程序
route()
生成url,该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),
    ])
);
$this->post( 
    route('users.update.photo', ['user' => $user]), // first argument
    [ 'photo' => UploadedFile::fake()->image('photo.jpeg', 500, 500)->size(1000) ]  // second argument
);
因此,使用此语法将文件作为
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),
    ])
);
$this->post( 
    route('users.update.photo', ['user' => $user]), // first argument
    [ 'photo' => UploadedFile::fake()->image('photo.jpeg', 500, 500)->size(1000) ]  // second argument
);

对调用
$this->post(路由('users.update.photo',['user'=>$user]),['photo'=>UploadedFile::fake()->image('photo.jpeg',500500)->大小(1000),])尝试此语法成功了!谢谢。不知道为什么我不能将你的评论标记为正确答案。好的,这只是一个评论。我会写一个答案