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