2016-04-26 37 views
20

Aggiornamento 2016/04/26 11:30 GMT + 2 Soluzione

Dal laravel 5.2.15, il parametro di prova $ è stato rimosso, ma non v'è alcuna ragione evidente, perché UploadedFile di Symfony ha ancora il parametro $ test.

Una soluzione alternativa consiste nell'utilizzare provvisoriamente Laravel 5.2.14.

Aggiornamento 2016/04/26 11:00 GMT + 2

proprio UploadedFile di laravel non passa il parametro $ test. Vedere queste risorse:

Lo so, c'è un'altra domanda: How to test file upload in Laravel 5.2, ma la risposta marcata non funziona per me.

Test Case

ho creare un'istanza della classe UploadedFile di Symfony e ho impostato $test a true. Inserisco il file in 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(); 
    } 
} 

controller

namespace App\Http\Controllers; 

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

     return []; 
    } 
} 

Problema

  • Il file da inviare ha l'argomento true per $test
  • Il file inviato arriva in upload()
  • $request->file('file') contiene gli argomenti giusti, ma

    $ test è falso

Sembra che il $ test argomento non è passato dalla chiamata posta. è un insetto?

risposta

26

Spiegazione

Questa è una cosa davvero interessante. Ne hai già notato molte durante la creazione di questo post (se qualcuno ha il problema dovrebbe leggerlo attentamente).

In questo commit come già accennato $testing parametro è stato rimosso e il codice delle classi è stata semplificata la rimozione di riflessione per ottenere testing valore della proprietà di Symfony\Component\HttpFoundation\File\UploadedFile.

E ora la cosa più complicata è che, a seconda di ciò che si sta testando, si potrebbe non notare il cambiamento e tutto potrebbe funzionare, ma in alcuni casi non lo sarà e non si sa davvero perché.

Per esempio tutto quello che potrebbe funzionare - il file verrà caricato senza un problema, ma se si aggiunge nella tua classe Richiesta per esempio mimes regola in questo modo:

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

fallirà con la risposta a file ha mimo non valida (questo perché internamente verrà anche verificato se il file è stato effettivamente caricato e in caso di test in realtà non è lo stesso del caricamento reale).

La soluzione sta guardando di nuovo a ciò che è stato realmente modificato nel commit e come il metodo è simile. In this file istanza del file caricato viene restituito in questo modo:

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

quindi nel caso in cui se il file è un'istanza di questa classe verrà restituito questo caso non modificato, altrimenti si creerà ora oggetto senza passare $testing argomento al costruttore della classe.

Soluzione

Quindi, per risolvere questo problema, quando si verifica il caricamento dei file si non dovrebbe più usare

\Symfony\Component\HttpFoundation\File\UploadedFile 

classe. Ora si dovrebbe usare

\Illuminate\Http\UploadedFile 

a non ottenere eventuali problemi di strano quando si verifica il caricamento di file (ovviamente si deve ancora passare a questo oggetto costruttore true come $testing parametro, ma ora sarà utilizzato in seguito senza problemi)

+0

Sì, hai ragione. Grazie! – schellingerht

+0

@schellingerht Nessun problema, ho avuto lo stesso problema oggi e stavo cercando di capire cosa sta succedendo –

+1

Laravel è un ottimo framework su cui ho lavorato, ma questi cambiamenti irrompono mi fanno incazzare! Ho trascorso molte ore a capirlo, in v5.2.0 funzionava perfettamente dopo l'aggiornamento alla 5.2.29 questo errore è successo anche su di me, risolto usando '\ Illuminate \ Http \ UploadedFile' Grazie per la risposta. –