2011-10-20 5 views
5

He intentado probar move_uploaded_file y is_uploaded_file con PHPUnit y vfsStream. Ellos siempre devuelven falso.Prueba move_uploaded_file y is_uploaded_file con vfsStream

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')); 
} 

¿Es posible? ¿Cómo puedo hacer eso? ¿Puedo publicar un vfsStreamFile (o cualquier información) sin un formulario, solo con el código PHP? Gracias.

Respuesta

2

No. move_uploaded_file y is_uploaded_file están específicamente diseñados para manejar archivos cargados. Incluyen controles de seguridad adicionales para garantizar que el archivo no haya sido alterado en el tiempo transcurrido entre la finalización de la carga y el script de control al acceder al archivo.

Cambiar el archivo desde el script cuenta como manipulación.

+1

¿Cómo se prueba la unidad utilizando estas funciones? Gracias. – user972959

+0

No tengo idea, en realidad. Nunca he usado phpunit. Hay algunas cosas aquí: http://stackoverflow.com/questions/3402765/how-can-i-write-tests-for-file-upload-in-php aunque no específicamente para phpunit. –

1

Suponiendo que está usando clases, puede crear una clase principal.

// 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); 
    } 
} 
Cuestiones relacionadas