2017-09-29 14 views
0

私はルーメン付きのファイルアップロードJSON APIを構築し、phpunit APIテストを作成しようとしています。ルーメン5.5 JSON API File UploadのテストはUploadedFileで中断します

私はそれがあるので、すぐに私は 、["file" => new UploadedFile(TestUtils::tempPath('test.jpg'), 'test.jpg', "image\jpeg", 100, null, true)]$this->json('POST', '/chunk', $data);経由で送信するように構成実像でファイルのアップロードをシミュレートしようとして、私はアップロードされたファイルで何もできないということですが、持っています問題配列と私はエラーを取得Call to a member function move() on array in ...

奇妙なことに私はUploadedFile::fake()->image('test.jpg')を使用する場合、それは私の要求をmanglesと私はそれを送信する他のデータは、コントローラで利用できません。

コントローラのファイルオブジェクトをdddすると、 "array(0){}"が表示されます。私はそれがUploadedFileObjectを使用している単体テストが正常に実行されるので、json( 'POST')経由の転送と関係があると考えています。

私は要求全体をddをした場合、それは示しています

["request"]=> 
    object(Symfony\Component\HttpFoundation\ParameterBag)#52 (1) { 
    ["parameters":protected]=> 
    array(5) { 
     ["chunkType"]=> 
     string(4) "flow" 
     ["flowIdentifier"]=> 
     string(13) "Testing123Bnu" 
     ["flowChunkNumber"]=> 
     int(1) 
     ["flowTotalChunks"]=> 
     int(2) 
     ["file"]=> 
     array(0) { 
     } 
    } 
    } 

... 

["files"]=> 
object(Symfony\Component\HttpFoundation\FileBag)#71 (1) { 
    ["parameters":protected]=> 
    array(0) { 
    } 
    } 

... 

["content":protected]=> string(103) "{(otherData..), "file":{}}" 

は、私はこれを回避するか、またはこのような状況では、ファイルのアップロードをテストする方法が分からないし、時間を探してきました。 UploadedFileコンストラクタのsymfonyテストモードは効果がありません。ここで

は私のテストで:

public function testChunkUpload_FlowChunk() 
    {  
     $data = [ (otherData) 
        "file"    => new UploadedFile(TestUtils::tempPath('test.jpg'), 'test.jpg', "image\jpeg", 100, null, true) 
        //UploadedFile::fake()->image('test.jpg') 
       ]; 

     $this->assertFileExists(TestUtils::tempPath('test.jpg')); 

     $this->json('POST', '/chunk', $data); 

     $this->assertEquals(200, $this->response->status()); 
     $this->assertEquals('application/json', $this->response->headers->get('Content-Type')); 
    } 

そして、ここでは私のコントローラの関連するメソッドです:

public function receiveChunk(Request $request){ 
    if (! $request->has('chunkType')) { 
     return response()->json(["Invalid Chunk Type"], 400); 
    } 
    $data = $this->chunkNormalizer->normalizeInput($request->all()); 
    $chunk = $this->chunkFactory->createChunk( (otherData) 
               $data['fileHandle']); 

    $this->fileAssembler->processChunk($chunk); 

    return response()->json(["Success"], 200);  
} 

、エラーがprocessChunkで発生します。

public function processChunk(FileChunk $chunk){ 
    ... 
    $chunkName = "..." . ".chunk"; 

    $fileHandle = $chunk->getFileHandle(); 
    $fileHandle->move($this->assemblePath, $chunkName); 
} 

任意のアイデアでしょう大変感謝しています!

答えて

0

EDIT:奇妙なことに、laravelドキュメントでは、 "json"メソッドが "call"の代わりに使用されます。これはエラーですか?またはルーメンの非互換性の問題ですか? (Laravel Docs)

私はテストを実行する方法を理解しました。ファイルがJSベンダーのライブラリからどのようにアップロードされたかに関する私の前提は間違っていました。実際、ファイルチャンクはXmlHttpRequest "multipart/formdata"でアップロードされ、JSONではなくアップロードされます。

私はエラー(JSONエンコーディング)を理解しましたが、ソースは理解しませんでした。 XmlHttpRequestを使用していることを理解した後、修正は簡単でした。テストの作業

:私はまだにUploadedFileを使用する理由がわからないよ

public function testChunkUpload_FlowChunk() 
{  
    $data = [ (otherData) 
       "file"    => new UploadedFile(TestUtils::tempPath('test.jpg'), 'test.jpg', "image\jpeg", 100, null, true) 
       //UploadedFile::fake()->image('test.jpg') 
      ]; 

    $this->assertFileExists(TestUtils::tempPath('test.jpg')); 

    $this->call('POST', '/chunk', $data); 

    $this->assertEquals(200, $this->response->status()); 
    $this->assertEquals('application/json', $this->response->headers->get('Content-Type')); 
} 

を::フェイク() - >画像( "xyz.jpg")は、さまざまな効果を持っていた、今テストは両方の方法で実行されます。