2011-10-20 11 views
5

Próbowałem przetestować plik move_uploaded_file i is_uploaded_file z PHPUnit i vfsStream. Zawsze zwracają fałsz.Test move_uploaded_file i is_uploaded_file z vfsStreamem

public function testShouldUploadAZipFileAndMoveIt() 
{ 
    $_FILES = array('fieldName' => array(
     'name'  => 'file.zip', 
     'type'  => 'application/zip', 
     'tmp_name' => 'vfs://root/file.zip', 
     'error' => 0, 
     'size'  => 0, 
    )); 

    vfsStream::setup(); 
    $vfsStreamFile = vfsStream::newFile('file.zip'); 
    vfsStreamWrapper::getRoot() 
     ->addChild($vfsStreamFile); 

    $vfsStreamDirectory = vfsStream::newDirectory('/destination'); 
    vfsStreamWrapper::getRoot() 
     ->addChild($vfsStreamDirectory); 

    $fileUpload = new File_Upload(); 
    $fileUpload->upload(
     vfsStream::url('root/file.zip'), 
     vfsStream::url('root/destination/file.zip') 
    ); 

    $this->assertFileExists(vfsStream::url('root/destination/file.zip')); 
} 

Czy to możliwe? Jak mogę to zrobić? Czy mogę wysłać plik vfsStreamFile (lub dowolne dane) bez formularza, używając tylko kodu PHP? Dziękuję.

Odpowiedz

2

Nr move_uploaded_file i is_uploaded_file są specjalnie zaprojektowane do obsługi przesyłanych plików. Obejmują one dodatkowe kontrole bezpieczeństwa, aby upewnić się, że plik nie został zmieniony w czasie pomiędzy ukończeniem przesyłania a skryptem sterującym uzyskującym dostęp do pliku.

Zmiana pliku z poziomu skryptu jest traktowana jako ingerencja.

+1

W jaki sposób testuje się jednostki za pomocą tych funkcji? Dzięki. – user972959

+0

Nie mam pojęcia. Nigdy nie używałem phpunit. Jest tu trochę rzeczy: http://stackoverflow.com/questions/3402765/how-can-i-write-tests-for-file-upload-in-php, ale nie specjalnie dla phpunit. –

1

Zakładając, że używasz zajęć, możesz utworzyć klasę nadrzędną.

// this is the class you want to test 
class File { 
    public function verify($file) { 
    return $this->isUploadedFile($file); 
    } 
    public function isUploadedFile($file) { 
    return is_uploaded_file($file); 
    } 
} 

// for the unit test create a wrapper that overrides the isUploadedFile method 
class FileWrapper extends File { 
    public function isUploadedFile($file) { 
    return true; 
    } 
} 

// write your unit test using the wrapper class 
class FileTest extends PHPUnit_Framework_TestCase { 
    public function setup() { 
    $this->fileObj = new FileWrapper; 
    } 

    public function testFile() { 
    $result = $this->fileObj->verify('/some/random/path/to/file'); 
    $this->assertTrue($result); 
    } 
} 
Powiązane problemy