6

PHPUnit テスト フレームワークは初めてです。

move_uploaded_file()ファイルがhttp POSTメソッドを介してアップロードされるまで、PHPの機能は機能しないことがわかっているため

だから、問題はPHPコマンドラインでこれをシミュレートする方法です

注:セレンを使用すると、Webフォームをシミュレートできます..しかし、別の代替手段が必要です。

4

5 に答える 5

8

基本的に、コードをよりテストしやすくする必要があります。分解して、残りのコードとは別に、HTTP 経由でファイルをアップロードするという単純な動作をテストできるようにします。の主な用途はmove_uploaded_file、追加のセキュリティ ストップを設定して、だまされて他のファイルを移動できないようにすることです。move_uploaded_file単純に、ファイルが同じリクエストでアップロードされたことを確認してから移動します。を使用してファイルを簡単に移動することもできますrename。そのため、アプリケーションを分割してRequest、現在の HTTP 要求を表し、カプセル化する 1 つのオブジェクトを作成しますis_uploaded_file。それが検証されたら、のrename代わりに使用できますmove_uploaded_fileRequestテストでは、オブジェクトをモックして、他のコードをテストできます。

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_filealwaysにオーバーライドできます。return true

于 2012-11-26T11:58:10.180 に答える
3

そこで、PHP Testing Framework(PHPT)が登場します。PEARとともにインストールされ、ファイルを書き込んでまたは.phptで実行することにより、HTTPリクエスト、I / O操作、ファイルのアップロードなどをPHPスクリプトにフィードできます。およびを使用してPHPUnitで実行することもできます。run-phptpear run-tests <file.phpt>PhptTestCasePhptTestSuite

ファイルのアップロードをシミュレートするには、ブラウザが送信するのと同じデータの--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がブログ投稿に例を書きましたが、それも失敗します。

于 2012-11-26T20:58:35.773 に答える
2

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)
于 2012-11-26T20:58:07.893 に答える
0

cURLを使用して、コマンド ラインからファイルのアップロードを実行できます。

curl --form input-name=@filename http://localhost/upload.php

input-name、通常使用される HTML の入力フィールドの名前でありfilename、アップロードするファイルのパスと名前です。それらを引用符で囲むか、特殊文字が含まれている場合はエスケープすることを忘れないでください。

ただし、これには明らかにWebサーバーからスクリプトを実行する必要があり、明らかにそれはあなたが望んでいるものではないので、PHPでファイルアップロードのテストを作成するにはどうすればよいですか? を参照してください。PHPUnit でファイルのアップロードをテストする方法については。

于 2012-11-26T11:45:53.650 に答える