unit test emails assertstatus assertsee php unit-testing laravel testing upload

php - emails - laravel unit test post



Cómo probar la carga de archivos en Laravel 5.2 (3)

Estoy tratando de probar una API de carga pero falla siempre:

Código de prueba:

$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'']));

la ruta del archivo es /public/uploads/test/34610974.jpg

Aquí está mi código de carga en un controlador:

$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]);

¿Cómo debo probar la carga de archivos en Laravel 5.2 ? ¿Cómo usar el método de call para cargar un archivo?


Cuando crea una instancia de UploadedFile establece el último parámetro $test en true .

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

Aquí hay un ejemplo rápido de una prueba de trabajo. Espera que tengas un archivo test.png en la carpeta 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 by Sebastian Bergmann and contributors. . Time: 2.97 seconds, Memory: 14.00Mb OK (1 test, 3 assertions)


En Laravel 5.4 también puede usar /Illuminate/Http/UploadedFile::fake() . Un simple ejemplo a continuación:

/** * @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()); }

Si quieres falsificar un tipo de archivo diferente, puedes usar

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

Más información directamente en Laravel Documentation .


Puede encontrar este código en este link

Preparar

/** * @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); }

Uso

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

Estructura de la carpeta:

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