Laravel5.1ユニットテストファイルのアップロード
著者:ZGJ
第3段階では、私は完全にステージ上で解くソフトの仕事は、要約を行うためにここに、私のユニットテストファイルアップロードの問題を悩ませてきました。
注意:以下の方法を第二の方法は簡単ですが、一定の制約が(私はステージ上で午前ファイルアップロードユニットテストを達成することができなかった理由がある)があり、つまり、この段階で法3人のファンブルを邪魔になりません普遍性が高いです。
以下は、テキストです。
方法a:鍛造ストレージ
具体的にはを参照してください。このブログ。
上記のバージョン5.4をlaravelを条件とします。
方法2:フォームの相互作用
具体的にはを参照してください。このブログ。
フロントエンド要素が入力された文書フォームのフォームまたは試験誤差に含まれなければならないという条件を有します。
この方法について詳細に説明3:使用した関数呼び出し
前のブログでは、私も言及による方法にして偽の店舗のアナログ入力を形成するには、情報の一部を構成することによって要求されるように、テストデータはポストを提出し、私はlaravel基礎となるコードを読み込もうとしましたが、失敗したが、様々な方法を得ることに失敗したことを成功、
:障害の根本原因を要約すると、そのある決定関数はhasFile要求インスタンスファイルを使用しているインスタンス化要求への唯一の$ _POSTグローバル変数にlaravel5.1で、データが送信ポスト機能と同等、ただしlaravel、グローバル変数、インスタンス化$ _fileの使用である変数、。
しかし、ユニットテスト実行要求プロセスをシミュレート原則LaravelのHTTP要求で、それが要求をインスタンス化するように指示されなければならないので、($ _fileに類似)と従属初期化変数の手順を使用してファイルが存在しなければなりません、したがって、この段階では、ポストによるソースコードの方法は、そのような読み取りとして呼んで、私は、この問題に対する画期的な解決策を見つけました。
まず、ポスト機能、この文のコア部分を見つけます:
$this->call('POST', $uri, $data, [], [], $server);
しかし、現実には、または関数呼び出しを参照するので、呼び出し関数を呼び出します。
public function call($method, $uri, $parameters = [], $cookies = [], $files = [], $server = [], $content = null) { $kernel = $this->app->make('Illuminate\Contracts\Http\Kernel'); $this->currentUri = $this->prepareUrlForRequest($uri); $request = Request::create( $this->currentUri, $method, $parameters, $cookies, $files, array_replace($this->serverVariables, $server), $content ); $response = $kernel->handle($request); $kernel->terminate($request, $response); return $this->response = $response; }
関数を呼び出すを参照してくださいので、私はすぐにパラメータの一つである輝く:$ファイル ;
さらにその実行ダウン、これはほとんどの例の要求を見て、中のコンテンツlaravelのindex.phpを次のとおりです。
$要求=要求::作成(
の$ this - > currentUri、$方式、$パラメータ、
$クッキー、$ファイル、array_replace(の$ this - > serverVariables、$サーバ)、$コンテンツ
);
関数呼び出しで見ることができますが$ファイルパラメータファイルのアップロード(使用するグローバル変数の、そしてもちろん他の要求のインスタンス)、その強力なテスト機能laravel公式文書のみ言及しているパラメータのパラメータを渡すことによってシミュレートすることができます他のパラメータが使用可能にしながら、凍結された着信......
さらに試みた後、私は完全に、問題を解決するコードの一部にプリペイド。
$pdf_info = [ 'name' => public_path().'/prepare_pdf/phylab_test.pdf' , 'error' => 0 , 'type' => 'pdf' , 'size' => 100000 , 'tmp_name' => public_path().'/prepare_pdf/phylab_test.pdf' , ] ; $pdf = new UploadedFile($pdf_info['tmp_name'], $pdf_info['name'], $pdf_info['type'], $pdf_info['size'], $pdf_info['error'] , true); self::assertTrue($pdf instanceof UploadedFile) ; $file_arr = [ 'prepare-pdf' => $pdf , ] ; $response = $this->call('POST' , '/console/uploadPre' , ['labID'=>'2134'] , [] , $file_arr); $data = $response->getData() ; self::assertEquals('上传成功' , $data->message) ;
3つのピットことに注意することが重要強調する次へ:
ピット1:にUploadedFileのインスタンス化パラメータは、テストを持っている必要があります=真
このコードに注意してください。
$ PDFファイル=新しいにUploadedFile([ 'tmp_name'] pdf_info $、$ pdf_info [ '名前']、[ '型'] pdf_info $、pdf_info $ [ 'サイズ']、[ 'エラー'] pdf_info $、真の);
UploadedFile 6は、インスタンス・パラメータを含むため、最初の5つは、容易にグローバル変数$ _fileが対応の構造では、5である文書情報を理解します。最後に、パラメータを省略することができず、真渡す必要があり、非常に重要!
理由を説明します:
ファイルのアップロードが自然にファイルをアップロードした後、ストレージに来て、ファイルアップロードの保管方法は、移動(目に見える具体的なコントローラのコードが含まこのブログでは)
決意が失敗した場合の方法は、まず、IsValid関数の決意を移動使用して、それが直接スローされます。
IsValid関数のコードを見て:
public function isValid() { $isOk = UPLOAD_ERR_OK === $this->error; return $this->test ? $isOk : $isOk && is_uploaded_file($this->getPathname()); }
関数は、PHPのドキュメントは、以下の説明で見ることができ、is_upload_fileリターンを使用することに注意してください:
is_uploaded_file - ファイルがHTTP POSTを介してアップロードされているかどうかを判断します
場合は
filename
、ファイルが与えられている返すためにHTTP POST経由でアップロードされTRUE。これは、/ etc / passwdファイルとして、アクセスすることはできません悪意のあるユーザーがこのファイルにスクリプトをだますことができないことを保証するために使用することができます。アップロードされたファイルは、その後、ユーザーまたはシステムの他のユーザーにその内容を明らかにする可能性がある場合、このチェックは特に重要です。
作るためにis_uploaded_file()関数が正しく動作するには、[$ _FILESに似て指定する必要があります[「tmp_name」]「userfile」]変数、およびクライアント[$ _FILESからアップロードされたファイルの名前に「userfile」] [「name」を]正常に機能することはできません。
PHPでは、ファイルアップロードパスは、一時的な記憶があり、関連の設定はもちろん、私は変更を加えるためにそれらを急いでいないだろう、php.iniファイルで見つけることができます。テストは、サーバー上のテストファイルを使用して、ファイル名に直接渡されているので、ので、この決定は、常にfalseを返す関数ます。
私たちは、引数がtrueの場合、それは判断の機能をis_upload_fileスキップしますテスト、そのテスト・パラメータに使用された最後のIsValid関数で返された、ことに留意すべきである、しかし、注意してfalseにテストパラメータのデフォルト理由です、 UploadedFilは、初期化パラメータで、真=テストする必要があります。
2ピット:$ファイルの引数の構造
パラメータ$ファイルなどの可視コードは次のとおりです。
$ file_arr = [
'準備-PDF' => $ PDFファイル、]。
ドキュメント(クラスにUploadedFileの文書インスタンス)のインスタンスに対応している必要があり、結合は、直接$ファイルへのファイルの引数としてインスタンスではありません。
ピットポイント3:実体ファイルは慎重にする必要がある操作
、このテストでは、私は、サーバー上の例のようにファイル名を直接テストpdfファイルのファイル名を使用するので、関連試験操作は直接実体ファイルを操作していることを確認するために、ファイルを復元する試験終了後はノー他のサイトにその関数は、次のテストのダメージと効果を引き起こす可能性が。
それはlaravel5.1ファイルアップロードのテスト方法であると役立つと私はもちろんの同じ問題プログラムの猿の友人を、遭遇する前に、内容を保証することはできませんこのブログは、これらすべてのビッグ後に、正しいことを期待して、ピットを注意するために、上記ソースコードの一部は、常に探求するための独自のメソッドを読み、間違っ見れば私を修正しようとしています。