Тестирование загрузки S3 с помощью Laravel Medialibrary "В текущем запросе нет файла в ключе с именем" - PullRequest
1 голос
/ 04 мая 2020

Я пишу функциональный тест для простой загрузки фотографий на S3 с использованием Laravel Medialibrary.

Это тест:

/** @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')); === true

но

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

Таким образом, я не прикрепляю свой фиктивный файл как файл к запросу, очевидно, но я Я не могу понять, как это сделать, и каждый пример, связанный с моими поисковыми запросами в Интернете, предлагает выполнить тест так, как я это уже делаю.

Любая помощь очень ценится.

1 Ответ

1 голос
/ 05 мая 2020

Метод 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
);
...