Php 使用Laravel Medialibrary测试S3上传;当前请求的密钥中没有名为“0”的文件;
我正在为使用Laravel媒体库上传到S3的简单照片编写一个功能测试 这就是测试: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);
/** @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),])尝试此语法代码>成功了!谢谢。不知道为什么我不能将你的评论标记为正确答案。好的,这只是一个评论。我会写一个答案