使用vfsStream测试move_uploaded_file和is_uploaded_file

时间:2011-10-20 17:33:56

标签: php unit-testing file tdd phpunit

我尝试用PHPUnit和vfsStream测试move_uploaded_file和is_uploaded_file。他们总是回归虚假。

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

有可能吗?我怎么做? 我可以使用PHP代码发布没有表单的vfsStreamFile(或任何数据)吗? 谢谢。

2 个答案:

答案 0 :(得分:2)

没有。 move_uploaded_file和is_uploaded_file专门用于处理上传的文件。它们包括额外的安全检查,以确保文件在上载完成和访问文件的控制脚本之间没有被篡改。

从脚本中更改文件会被视为篡改。

答案 1 :(得分:1)

假设您正在使用类,则可以创建父类。

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