2016-04-26 15 views
20

アップデート2016年4月26日11:30 GMT + 2回避策

はLaravel 5.2.15ので、$テスト・パラメータが削除されますが、symfonyのにUploadedFileはまだ$テストパラメータを持っているので、明確な理由は、ありません。

回避策は、Laravel 5.2.14を仮使用することです。

アップデート2016年4月26日11時00 GMT + 2

Laravel自身にUploadedFileは$テストパラメータを渡しません。これらのリソースを参照してください。

は、別の質問があります:How to test file upload in Laravel 5.2が、マークされた答えは私のために動作しません。

テストケース

私はsymfonyのにUploadedFileクラスのインスタンスを作成して、私はtrue$testを設定します。ファイルをfile/uploadに投稿します。投稿する

class FileControllerTest extends TestCase 
{ 
    use \Illuminate\Foundation\Testing\DatabaseTransactions; 

    private $file; 

    public function setUp() 
    { 
     parent::setUp(); 

     $this->file = new Symfony\Component\HttpFoundation\File\UploadedFile(
      public_path() . '/examples/example.jpg', 
      'example.jpg', 
      'image/jpeg', 
      filesize(public_path() . '/examples/example.jpg'), 
      null, 
      true // for $test 
     ); 
    } 

    /** @test */ 
    public function it_uploads_a_valid_file() 
    { 
     var_dump($this->file); // $test = true 
     $this->call('POST', 'file/upload', [], [], ['file' => $this->file], 
      ['accept' => 'application/json']); 

     $this->assertResponseOk(); 
    } 
} 

コントローラ

namespace App\Http\Controllers; 

class FileController extends Controller 
{ 
    public function upload(Request $request) 
    { 
     var_dump($request->file('file')); // $test = false 

     return []; 
    } 
} 

問題

  • ファイルが投稿されたファイルがupload()
  • に到着$test

  • の引数trueを持っていますは、右の引数が含まれていますが、

    $テスト引数$テストはポストコールによって、過去ではないようです

です。これはバグですか?

答えて

26

説明

これは本当に面白いことです。この投稿を作成する際には、すでに多くのことに気がついています(誰かが問題を慎重に読まなければならない場合)。 Symfony\Component\HttpFoundation\File\UploadedFiletestingプロパティ値を取得するためにリフレクションを削除このcommit

すでに$testingパラメータを述べたように除去し、クラスのコードが簡素化されました。

あなたがテストしているものによっては、変化に気付かずにすべてが動くかもしれませんが、場合によってはそれを知りません。

たとえば、すべてがうまくいくかもしれない - ファイルは問題なくアップロードされますが、あなたは、例えば、あなたのリクエストクラスにそのようなmimesルール追加した場合:

'logo' => ['mimes:jpeg,png'], 

をそのファイルに無効なMIMEを持っているあなたに言って失敗します。 (これは、ファイルが本当にアップロードされたかどうか、また実際には実際のアップロードと同じではないというテストの場合にも内部的に検証されるためです)。

解決策は、実際にコミットに変更されたものと、その方法がどのように見えるかを再度検討しています。 this fileでアップロードされたファイルのインスタンスは、そのように返されます。

return $file instanceof static ? $file : new static(
      $file->getRealPath(), $file->getClientOriginalName(), $file->getClientMimeType(), 
      $file->getClientSize(), $file->getError() 
     ); 

ファイルは、このクラスのインスタンスである場合はその場合には、それはそれ以外の場合は、クラスのコンストラクタに$testing引数を渡すことなく、オブジェクトを今作成し、変更されていないこのインスタンスを返します。

ソリューション

ので、ファイルのアップロードをテストするとき、あなたはもう

\Symfony\Component\HttpFoundation\File\UploadedFile 

クラスを使用しないでください、これを解決します。あなたは今

ファイルのアップロードをテストするときに任意の奇妙な問題を得ることはありません(もちろん、あなたはまだ $testingパラメータとして、このオブジェクトのコンストラクタ trueに渡す必要がありますが、今では問題なく、後に使用されます)する

\Illuminate\Http\UploadedFile 

を使用する必要があります

+0

はい、そうです。ありがとう! – schellingerht

+0

@schellingerht問題はありません。今日は同じ問題があり、何が起こっているのか把握しようとしていました。 –

+1

Laravelは私が取り組んできた素晴らしいフレームワークです。私はそれを理解するのに多くの時間を費やしましたが、v5.2.0では5.2.29へのアップグレード後に完全に動作していました。このエラーは私にとっても起こり、\ Illuminate \ Http \ UploadedFileを使って解決しました。 –

関連する問題