Я пытаюсь проверить 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
для загрузки файла?
Когда вы создаете экземпляр 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