2011-10-20 17 views
5

PHPUnitとvfsStreamでmove_uploaded_fileとis_uploaded_fileをテストしようとしました。彼らは常にfalseを返します。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

番号move_uploaded_fileとis_uploaded_fileは、アップロードされたファイルを処理するために特別に設計されています。これらのファイルには、アップロードが完了してからファイルにアクセスする制御スクリプトまでの間にファイルが改ざんされていないことを確認するための追加のセキュリティチェックが含まれています。

スクリプト内からファイルを変更すると、改ざんとみなされます。

+1

これらの機能を使用してユニットテストを行うにはどうすればよいですか?ありがとう。 – user972959

+0

実際は考えていません。私はphpunitを使ったことがありません。ここにはいくつかのものがあります:http://stackoverflow.com/questions/3402765/how-can-i-write-tests-for-file-upload-in-php特にphpunitのためではありません。 –

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); 
    } 
} 
関連する問題