Laravel тест не может найти файл по пути, используя Storage :: fake () - PullRequest
0 голосов
/ 09 февраля 2020

Я создал свой собственный «диск» в config/filesystems.php, который выглядит следующим образом;

'uploads' => [
    'driver' => 'local',
    'root' => storage_path('app/public') . '/uploads'
],

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

public function store(Request $request)
{
    if ($request->hasFile('filename')) {
        foreach ($request->file('filename') as $image) {
            $fileName = md5($image . microtime()) . '.' . $image->getClientOriginalExtension();
            $image->storeAs('', $fileName, 'uploads');
        }
    }

    // return goes here
}

, но когда я go для проверки моего метода хранения с использованием следующего кода;

public function testUserCanSuccessfullySubmitSingleImage(): void
{
    Storage::fake('uploads');

    $this->postJson('/upload', [
        'filename' => UploadedFile::fake()->image('image1.jpg')
    ]);

    Storage::disk('uploads')->assertExists('image1.jpg');
    Storage::disk('uploads')->assertMissing('missing.jpg');
}

я получаю следующую ошибку;

Unable to find a file at path [image1.jpg].
Failed asserting that false is true.

Я прошел несколько уроков, но все они говорят одно и то же, и я действительно потерян.

Любая помощь будет принята с благодарностью.

Приветствия

1 Ответ

2 голосов
/ 11 февраля 2020

Проблема в том, что вы переименовываете свой файл в контроллере с помощью md5($image . microtime()), поэтому вы не можете утверждать, что image1.jpg существует, так как вы изменили имя.

Что вы могли бы сделать, это позволить laravel name файл и затем проверьте, что в вашем тесте:

В вашем контроллере:

Замените storeAs на store, store сгенерирует уникальный идентификатор, который будет служить именем файла.

public function store(Request $request)
{
    if ($request->hasFile('filename')) {
        foreach ($request->file('filename') as $image) {
            $image->store('', 'uploads');
        }
    }
}

В вашем тесте:

Чтобы установить, существует ли изображение, мы будем использовать тот же метод для генерации уникального идентификатора, что и laravel при сохранении изображения. Замените 'image1.jpg' на $image->hashName() в своем утверждении.

public function testUserCanSuccessfullySubmitSingleImage(): void
{
    Storage::fake('uploads');

    $this->postJson('/upload', [
        'filename' => $image = UploadedFile::fake()->image('image1.jpg')
    ]);

    Storage::disk('uploads')->assertExists($image->hashName());
    Storage::disk('uploads')->assertMissing('missing.jpg');
}

Из документов :

В веб-приложениях одно из самых Распространенные сценарии использования для хранения файлов - это сохранение загруженных пользователем файлов, таких как изображения профиля, фотографии и документы. Laravel позволяет очень легко сохранять загруженные файлы, используя метод store для экземпляра загруженного файла. Вызовите метод store с путем, по которому вы sh сохраните загруженный файл:

public function update(Request $request)
{
    $path = $request->file('avatar')->store('avatars');

    return $path;
}

В этом примере необходимо отметить несколько важных моментов. Обратите внимание, что мы указали только имя каталога, а не имя файла. По умолчанию метод store генерирует уникальный идентификатор в качестве имени файла. Расширение файла будет определено путем изучения типа файла MIME. Путь к файлу будет возвращен методом store, чтобы вы могли сохранить путь, включая сгенерированное имя файла, в вашей базе данных.

...