Загрузка файла тестирования Laravel всегда заканчивается неудачей - PullRequest
1 голос
/ 09 октября 2019

Я хочу написать тест для загрузки файла, для этого сначала я загружаю файл, затем вызываю API для загрузки выгруженного файла, загрузка успешно завершена, но загрузка всегда завершается неудачно и показывает The file "/var/www/public/uploads/dWwECsHQpcwJuYTn6uaLmPxk4uINOeYOZYiZ86Oc.jpeg" does not exist. Ниже приводится содержание моей функции тестирования:

Storage::fake('public');
$business = factory(Business::class)->create(['owner_id' => $this->businessUser->id]);
$response = $this->jsonAs($this->businessUser,'POST', '/api/file/business', [
    'file' => $file = UploadedFile::fake()->create('invalid file.jpg'),
    'attachable_id' => $business->id,
    'attachable_type' => 'businesses'
]);

$response->assertJson(['name' => $file->hashName()]);
Storage::disk('public')->assertExists('uploads/' . $file->hashName());

$uploadRes = $response->decodeResponseJson();

$response = $this->jsonAs($this->businessUser, 'GET', '/api/file/'. $uploadRes['id'] . '/business/' .$business->id);
// This assertion always fails 
// If I dd above response, shows this message 'The file "/var/www/public/uploads/dWwECsHQpcwJuYTn6uaLmPxk4uINOeYOZYiZ86Oc.jpeg" does not exist'    
$this->assertTrue($response->headers->get('content-type') == $file->getClientMimeType());
$this->assertTrue($response->headers->get('content-disposition') == 'attachment; filename="' . $uploadRes['original_filename'] . '"');
$response->assertStatus(200);

Ниже приводится содержимое моей функции загрузки:

$attachment = Attachment::where('id', $id)->firstOrFail();
$path = public_path(). '/uploads/' . $attachment->name;

return response()->download($path, $attachment->original_filename, ['Content-Type' => $attachment->mime]);

Ответы [ 2 ]

1 голос
/ 09 октября 2019

Убедитесь, что файл существует в каталоге public / upload , а также вы можете создать ссылку для файлов общего каталога с помощью функции url().

EX:

$attachment = Attachment::where('id', $id)->firstOrFail();
$path = url('uploads/' . $attachment->name);

return response()->download($path, $attachment->original_filename, ['Content-Type' => $attachment->mime]);
0 голосов
/ 09 октября 2019

В реализации загрузки я заметил, что используется функция public_path.

public_path функция разрешает из контейнера службы, возможно, создавая новый путь из реального пути для public конфигурация диска.

Storage::fake задает путь к диску и возвращает FilesystemAdapter, и вы хотите убедиться, что это экземпляр, используемый в жизненном цикле для спецификации тестирования.

Я предлагаю попробовать использовать метод path из FilesystemAdapter через Storage фасад для построения пути в реализации загрузки вместо вспомогательной функции public_path. Например:

Storage::disk('public')->path('uploads/'.$attachment->name);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...