it-swarm.com.de

So testen Sie das Hochladen von Dateien in Laravel 5.2

Ich versuche, eine Upload-API zu testen, die jedoch jedes Mal fehlschlägt: 

Testcode:

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

der Dateipfad lautet /public/uploads/test/34610974.jpg

Hier ist mein Upload-Code in einem Controller:

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

Wie soll ich das Hochladen von Dateien in Laravel 5.2 testen? Wie verwendet man die call-Methode zum Hochladen einer Datei?

32
Ramin

Wenn Sie eine Instanz von UploadedFile erstellen, setzen Sie den letzten Parameter $test auf true.

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

Hier ist ein schnelles Beispiel für einen Arbeitstest. Es erwartet, dass Sie eine test.png-Datei im tests/stubs-Ordner haben.

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);
    }
}
 P phpunit tests/UploadTest.php 
 PHPUnit 4.8.24 von Sebastian Bergmann und Mitwirkenden .

.

 Zeit: 2,97 Sekunden, Speicher: 14,00 MB 

OK (1 Test, 3 Aussagen) 
45
peterm

In Laravel 5.4 können Sie auch \Illuminate\Http\UploadedFile::fake() verwenden. Ein einfaches Beispiel unten:

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

Wenn Sie einen anderen Dateityp vorgeben möchten, können Sie verwenden 

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

Weitere Informationen direkt auf Laravel-Dokumentation .

11
MiCc83

Sie finden diesen Code unter Link

Konfiguration

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

Verwendungszweck

    $fileName = 'orders.csv';
    $filePath = __DIR__ . '/Stubs/';

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

Ordnerstruktur:

- MyTests
  - TestA.php
  - Stubs
    - orders.csv
0
Mahmoud Zalt