Проверьте файл move_uploaded_file и is_uploaded_file с помощью vfsStream - PullRequest
5 голосов
/ 20 октября 2011

Я пытался протестировать move_uploaded_file и is_uploaded_file с помощью PHPUnit и vfsStream.Они всегда возвращают false.

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

Возможно ли это?Как я могу это сделать?Могу ли я опубликовать vfsStreamFile (или любые данные) без формы, просто используя код PHP?Спасибо.

Ответы [ 2 ]

2 голосов
/ 20 октября 2011

Нет. move_uploaded_file и is_uploaded_file специально предназначены для обработки загруженных файлов. Они включают дополнительные проверки безопасности, чтобы гарантировать, что файл не был подделан во время между завершением загрузки и управляющим сценарием, обращающимся к файлу.

Изменение файла из скрипта считается фальсификацией.

1 голос
/ 03 апреля 2014

Если вы используете классы, вы можете создать родительский класс.

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