Как протестировать загрузку файлов в Laravel 5.2

Я пытаюсь проверить API загрузки, но он терпит неудачу каждый раз:

Тестовый код:

$JSONResponse = $this->call('POST', '/upload', [], [], [ 'photo' => new UploadedFile(base_path('public/uploads/test') . '/34610974.jpg', '34610974.jpg') ]); $this->assertResponseOk(); $this->seeJsonStructure(['name']); $response = json_decode($JSONResponse); $this->assertTrue(file_exists(base_path('public/uploads') . '/' . $response['name'])); 

путь к файлу – /public/uploads/test/34610974.jpg

Вот мой код загрузки в контроллере:

 $this->validate($request, [ 'photo' => 'bail|required|image|max:1024' ]); $name = 'adummyname' . '.' . $request->file('photo')->getClientOriginalExtension(); $request->file('photo')->move('/uploads', $name); return response()->json(['name' => $name]); 

Как проверить загрузку файлов в Laravel 5.2 ? Как использовать метод call для загрузки файла?

Related of "Как протестировать загрузку файлов в Laravel 5.2"

Когда вы создаете экземпляр UploadedFile установите для последнего параметра $test значение true .

 $file = new UploadedFile($path, $name, filesize($path), 'image/png', null, true); ^^^^ 

Вот краткий пример рабочего теста. Он ожидает, что у вас есть файл stub test.png папке tests/stubs .

 class UploadTest extends TestCase { public function test_upload_works() { $stub = __DIR__.'/stubs/test.png'; $name = str_random(8).'.png'; $path = sys_get_temp_dir().'/'.$name; copy($stub, $path); $file = new UploadedFile($path, $name, filesize($path), 'image/png', null, true); $response = $this->call('POST', '/upload', [], [], ['photo' => $file], ['Accept' => 'application/json']); $this->assertResponseOk(); $content = json_decode($response->getContent()); $this->assertObjectHasAttribute('name', $content); $uploaded = 'uploads'.DIRECTORY_SEPARATOR.$content->name; $this->assertFileExists(public_path($uploaded)); @unlink($uploaded); } } 
 ➔ phpunit tests / UploadTest.php
 PHPUnit 4.8.24 от Себастьяна Бергмана и авторов.

 ,

 Время: 2,97 секунды, Память: 14.00Mb

 OK (1 тест, 3 утверждения)

В Laravel 5.4 вы также можете использовать \Illuminate\Http\UploadedFile::fake() . Простой пример ниже:

 /** * @test */ public function it_should_allow_to_upload_an_image_attachment() { $this->post( action('AttachmentController@store'), ['file' => UploadedFile::fake()->image('file.png', 600, 600)] ); /** @var \App\Attachment $attachment */ $this->assertNotNull($attachment = Attachment::query()->first()); $this->assertFileExists($attachment->path()); @unlink($attachment->path()); } 

Если вы хотите подделать другой тип файла, вы можете использовать

 UploadedFile::fake()->create($name, $kilobytes = 0) 

Дополнительная информация непосредственно по документации Laravel .

Вы можете найти этот код по этой ссылке

Настроить

 /** * @param $fileName * @param $stubDirPath * @param null $mimeType * @param null $size * * @return \Illuminate\Http\UploadedFile */ public static function getTestingFile($fileName, $stubDirPath, $mimeType = null, $size = null) { $file = $stubDirPath . $fileName; return new \Illuminate\Http\UploadedFile\UploadedFile($file, $fileName, $mimeType, $size, $error = null, $testMode = true); } 

Применение

  $fileName = 'orders.csv'; $filePath = __DIR__ . '/Stubs/'; $file = $this->getTestingFile($fileName, $filePath, 'text/csv', 2100); 

Структура папок:

 - MyTests - TestA.php - Stubs - orders.csv