2016-04-04 2 views
24

Im пытается протестировать API загрузки, но это не удается каждый раз:Как проверить загрузку файлов в Laravel 5,2

Код проверки:

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

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

ответ

31

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

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

Вот краткий пример рабочего теста. Он ожидает, что у вас есть заглушка 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 by Sebastian Bergmann and contributors. 

. 

Time: 2.97 seconds, Memory: 14.00Mb 

OK (1 test, 3 assertions) 
+1

Это должно сработать, но это не так. '$ request-> file ('photo')' действительно имеет объект UploadFile, но '$ test' в этом объекте имеет значение по умолчанию' false'. Странно, потому что новый UploadedFile имеет параметр $ test = true. – schellingerht

+1

Ответ на этот вопрос недостаточно для> 5.2.14. Правильный ответ можно найти здесь: http://stackoverflow.com/questions/36857800/laravel-5-2-testing-uploadedfile-misses-the-test-value-after-post-bug – schellingerht

+1

Он должен быть '$ file = new UploadedFile ($ path, $ name, 'image/png', filesize ($ path), null, true); ' –

0

Вы можете найти этот код на этом link

установки

/** 
* @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 
7

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

/** 
* @test 
*/ 
public function it_should_allow_to_upload_an_image_attachment() 
{ 
    $this->post(
     action('[email protected]'), 
     ['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 Documentation.

+0

Но метод create() не проходит проверку, если вы запрашиваете только определенный тип MIME, например mp3 ... – Syl