PHPUnit テスト フレームワークは初めてです。
move_uploaded_file()
ファイルがhttp POSTメソッドを介してアップロードされるまで、PHPの機能は機能しないことがわかっているため
だから、問題はPHPコマンドラインでこれをシミュレートする方法です
注:セレンを使用すると、Webフォームをシミュレートできます..しかし、別の代替手段が必要です。
基本的に、コードをよりテストしやすくする必要があります。分解して、残りのコードとは別に、HTTP 経由でファイルをアップロードするという単純な動作をテストできるようにします。の主な用途はmove_uploaded_file
、追加のセキュリティ ストップを設定して、だまされて他のファイルを移動できないようにすることです。move_uploaded_file
単純に、ファイルが同じリクエストでアップロードされたことを確認してから移動します。を使用してファイルを簡単に移動することもできますrename
。そのため、アプリケーションを分割してRequest
、現在の HTTP 要求を表し、カプセル化する 1 つのオブジェクトを作成しますis_uploaded_file
。それが検証されたら、のrename
代わりに使用できますmove_uploaded_file
。Request
テストでは、オブジェクトをモックして、他のコードをテストできます。
move_uploaded_file
たとえば、次のように単純にモック可能にすることもできます。
class Foo {
public function do() {
...
$this->move_uploaded_file($from, $to);
...
}
protected function move_uploaded_file($from, $to) {
return move_uploaded_file($from, $to);
}
}
テストでは、クラスを拡張/モックして、たとえばFoo::move_uploaded_file
alwaysにオーバーライドできます。return true
そこで、PHP Testing Framework(PHPT)が登場します。PEARとともにインストールされ、ファイルを書き込んでまたは.phpt
で実行することにより、HTTPリクエスト、I / O操作、ファイルのアップロードなどをPHPスクリプトにフィードできます。およびを使用してPHPUnitで実行することもできます。run-phpt
pear run-tests <file.phpt>
PhptTestCase
PhptTestSuite
ファイルのアップロードをシミュレートするには、ブラウザが送信するのと同じデータの--POST_RAW--
セクションを使用する必要があります。これは、PHPQATサイトの例です。
重要:残念ながら、彼らのサイトの例は説明なしに失敗します。
is_uploaded_file.phpt
--TEST--
is_uploaded_file() function
--CREDITS--
Dave Kelsey <d_kelsey@uk.ibm.com>
--SKIPIF--
<?php if (php_sapi_name()=='cli') die('skip'); ?>
--POST_RAW--
Content-type: multipart/form-data, boundary=AaB03x
--AaB03x
content-disposition: form-data; name="field1"
Joe Blow
--AaB03x
content-disposition: form-data; name="pics"; filename="file1.txt"
Content-Type: text/plain
abcdef123456789
--AaB03x--
--FILE--
<?php
// uploaded file
var_dump(is_uploaded_file($_FILES['pics']['tmp_name']));
// not an uploaded file
var_dump(is_uploaded_file($_FILES['pics']['name']));
// not an uploaded file
var_dump(is_uploaded_file('random_filename.txt'));
// not an uploaded file
var_dump(is_uploaded_file('__FILE__'));
// Error cases
var_dump(is_uploaded_file());
var_dump(is_uploaded_file('a', 'b'));
?>
--EXPECTF--
bool(true)
bool(false)
bool(false)
bool(false)
Warning: is_uploaded_file() expects exactly 1 parameter, 0 given in %s on line %d
NULL
Warning: is_uploaded_file() expects exactly 1 parameter, 2 given in %s on line %d
NULL
ランニング
pear run-tests --cgi=PHPCGI is_uploaded_file.phpt
Manuel Pichlerがブログ投稿に例を書きましたが、それも失敗します。
move_uploaded_file
実際のチェックをモックアウトせずにPHPUnitを使用してファイルのアップロードを.phpt
テストする場合は、PHPUnitが実行できるテストケースを使用できるため、Webリクエストをシミュレートします。
基本的に.phpt
、次のようなファイルを作成します。
uploadTest.phpt
--TEST--
Example test emulating a file upload
--POST_RAW--
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryfywL8UCjFtqUBTQn
------WebKitFormBoundaryfywL8UCjFtqUBTQn
Content-Disposition: form-data; name="file"; filename="example.txt"
Content-Type: text/plain
Qafoo provides quality assurance support and consulting
------WebKitFormBoundaryfywL8UCjFtqUBTQn
Content-Disposition: form-data; name="submit"
Upload
------WebKitFormBoundaryfywL8UCjFtqUBTQn--
--FILE--
<?php
var_dump(is_uploaded_file($_FILES['file']['tmp_name']));
?>
--EXPECT--
bool(true)
を使用して実行phpunit uploadTest.phpt
完全な説明については、詳細を説明しているブログ投稿をチェックしてください。
http://qafoo.com/blog/013_testing_file_uploads_with_php.html
また:There is working sample code over at github
--TEST--
Example test emulating a file upload
--POST_RAW--
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryfywL8UCjFtqUBTQn
------WebKitFormBoundaryfywL8UCjFtqUBTQn
Content-Disposition: form-data; name="file"; filename="example.txt"
Content-Type: text/plain
Qafoo provides quality assurance support and consulting
------WebKitFormBoundaryfywL8UCjFtqUBTQn
Content-Disposition: form-data; name="submit"
Upload
------WebKitFormBoundaryfywL8UCjFtqUBTQn--
--FILE--
<?php
require __DIR__ . '/UploadExample.php';
$upload = new UploadExample('/tmp');
$upload->handle('file');
var_dump(file_exists('/tmp/example.txt'));
?>
--EXPECT--
bool(true)
cURLを使用して、コマンド ラインからファイルのアップロードを実行できます。
curl --form input-name=@filename http://localhost/upload.php
はinput-name
、通常使用される HTML の入力フィールドの名前でありfilename
、アップロードするファイルのパスと名前です。それらを引用符で囲むか、特殊文字が含まれている場合はエスケープすることを忘れないでください。
ただし、これには明らかにWebサーバーからスクリプトを実行する必要があり、明らかにそれはあなたが望んでいるものではないので、PHPでファイルアップロードのテストを作成するにはどうすればよいですか? を参照してください。PHPUnit でファイルのアップロードをテストする方法については。