使用 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
);
我正在编写一个功能测试,用于使用 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
);