2016-04-26 5 views
20

aktualisieren 2016.04.26 11.30 GMT + 2 Behelfslösung

Seit Laravel 5.2.15 wird der $ Prüfparameter entfernt, aber es gibt keinen ersichtlichen Grund, weil symfonys UploadedFile noch die $ Prüfparameter hat.

Eine Problemumgehung ist, provisorisch Laravel 5.2.14 zu verwenden.

aktualisieren 2016.04.26 11.00 Uhr GMT + 2

Laravel eigenen UploadedFile nicht die $ Test-Parameter übergeben. Sehen Sie die folgenden Ressourcen:

Ich weiß, es ist eine andere Frage: How to test file upload in Laravel 5.2, aber die deutliche Antwort für mich nicht funktioniert.

Test Case

ich eine Instanz von UploadedFile Klasse Symfony und ich setzen $test zu true. Ich poste die Datei auf 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 []; 
    } 
} 

Problem

  • Die Datei zu schreiben hat das Argument true für $test
  • Der entsandte Datei
  • in upload() kommtenthält die richtigen Argumente, aber

    $ test ist falsch

Es scheint das Argument $ Test nicht in der Vergangenheit durch die Post Anruf. Ist das ein Fehler?

Antwort

26

Erklärung

Das ist wirklich interessante Sache. Sie haben bereits viel bemerkt, wenn Sie diesen Beitrag verfassen (wenn jemand das Problem hat, sollten Sie es sorgfältig lesen).

In diesem commit wie Sie bereits $testing Parameter erwähnt wurde entfernt und Code der Klassen wurde vereinfacht das Entfernen Reflection testing Eigenschaftswert von Symfony\Component\HttpFoundation\File\UploadedFile zu erhalten.

Und jetzt ist die schwierige Sache, dass abhängig von dem, was Sie testen, Sie Ereignis möglicherweise nicht bemerken, die Änderung und alles könnte funktionieren, aber in einigen Fällen wird es nicht und Sie werden nicht wirklich wissen warum.

Zum Beispiel alles funktionieren könnte - Datei wird, ohne ein Problem hochgeladen werden, aber wenn Sie zum Beispiel mimes Regel wie so in Ihre Anfrage Klasse hinzufügen:

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

es fehlschlagen Sie die Datei ungültig Pantomime erzählt wird hat (Dies liegt daran, dass intern auch überprüft wird, ob die Datei wirklich hochgeladen wurde und im Falle von Tests ist das nicht dasselbe wie beim echten Hochladen).

Die Lösung schaut sich wieder an, was wirklich in das Commit geändert wurde und wie die Methode aussieht. In this file Instanz hochgeladene Datei ist wie so zurückgegeben:

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

so im Fall, wenn die Datei Instanz dieser Klasse ist, wird es diese Instanz nicht modifiziert zurückkehren, sonst wird es nun ohne Umweg $testing Arguments Klasse Konstruktor-Objekt zu erstellen.

Lösung

Also, diese zu lösen, wenn das Hochladen von Dateien zu testen, sollten Sie nicht mehr

\Symfony\Component\HttpFoundation\File\UploadedFile 

Klasse. Sie sollten jetzt

\Illuminate\Http\UploadedFile 

zu tun, nicht bekommen keine seltsame Fragen verwenden, wenn das Hochladen von Dateien zu testen (natürlich sollten Sie auf dieses Objekt Konstruktor übergeben noch true als $testing Parameter aber jetzt wird es später ohne Probleme verwendet werden)

+0

Ja, Sie haben Recht. Vielen Dank! – schellingerht

+0

@schellingerht Kein Problem, ich hatte das gleiche Problem heute und versuchte herauszufinden, was los ist –

+1

Laravel ist ein toller Rahmen, an dem ich gearbeitet habe, aber diese brechenden Veränderungen machen mich wütend! Ich verbrachte viele Stunden, um es herauszufinden, in v5.2.0 funktionierte perfekt nach dem Upgrade auf 5.2.29 dieser Fehler ist auch bei mir passiert, gelöst mit '\ Illuminate \ Http \ UploadedFile' Danke für Ihre Antwort. –