Soru Laravel 5.2 | UploadedFile test ediliyor Post sonrası $ test Değeri eksik. Hata?


Güncelleme 2016/04/26 11:30 GMT + 2 Geçici Çözüm

Laravel 5.2.15'ten beri, $ test parametresi kaldırıldı, ancak net bir neden yok çünkü Symfony'nin UploadedFile değeri hala $ test parametresine sahip.

Bir geçici çözüm, Laravel 5.2.14'ü geçici olarak kullanmaktır.

Güncelleme 2016/04/26 11:00 GMT + 2

Laravel'in kendi UploadedFile değeri $ test parametresini geçmiyor. Şu kaynaklara bakın:

Biliyorum, başka bir soru var: Laravel 5.2'de dosya yükleme testi nasıl yapılırama işaretlenmiş cevap benim için çalışmıyor.

Test durumu

Symfony'nin UploadedFile sınıfının bir örneğini oluşturuyorum ve $test için true. Dosyayı 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();
    }
}

kontrolör

namespace App\Http\Controllers;

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

        return [];
    }
}

Sorun

  • Gönderilecek dosyanın argümanı var true için $test
  • Gönderi dosyası geldiğinde upload()
  • $request->file('file') doğru argümanları içerir, ancak

    $ testi olduğu yanlış

Bu argüman gibi görünüyor, $ post testi tarafından geçmiş değil. Bu bir hata mı?


21
2018-04-26 07:14


Menşei




Cevaplar:


açıklama

Bu gerçekten ilginç bir şey. Bu yazıyı oluştururken zaten çok fazla şey fark ettiniz (sorun varsa, bunu dikkatli bir şekilde okumalısınız).

Bunda işlemek zaten bahsettiğin gibi $testing parametre kaldırıldı ve sınıfların kodları sadeleştirildi. testing özellik değeri Symfony\Component\HttpFoundation\File\UploadedFile.

Ve şimdi de zor olan şey, test ettiğiniz şeye bağlı olarak, değişime ve her şeyin işe yarayabileceğine dair bir durum olmayabilir, ancak bazı durumlarda bunu yapmayacak ve gerçekten nedenini bilmeyeceksiniz.

Örneğin her şey işe yarayabilir - dosya sorunsuz bir şekilde yüklenir, ancak örneğin Request sınıfınıza eklerseniz mimes kural şöyle:

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

Dosyada geçersiz bir mime olduğunu bildirmekten başarısız olur (bunun nedeni, dosya gerçekten yüklendiyse ve gerçek testler gerçekte değilse, testler gerçekten de doğrulanacaktır).

Çözüm, gerçekten değişime ve yöntemin nasıl göründüğüne baktığımızda tekrar bakıyor. İçinde bu dosya yüklenen dosyanın örneği şu şekilde döndürülür:

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

Bu durumda, eğer dosya bu sınıfın örneğiyse, bu örneği değiştirilmemiş olarak döndürecektir, aksi halde artık nesneyi, geçiş yapmadan oluşturacaktır. $testing sınıf kurucusuna argüman.

Çözüm

Bunu çözmek için, dosya yüklemelerini test ederken kullanmamalı 

\Symfony\Component\HttpFoundation\File\UploadedFile

artık sınıf. Şimdi kullanmalısın

\Illuminate\Http\UploadedFile

Dosya yüklemelerini test ederken herhangi bir garip sorun yaşamayacağınız (tabii ki hala bu nesne yapıcısına geçmelisiniz) true gibi $testing parametre ama şimdi daha sorunsuz bir şekilde kullanılacaktır)


29
2018-05-18 17:50



Evet haklısın. Teşekkürler! - schellingerht
@schellingerht Sorun değil, bugün aynı sorunu yaşadım ve neler olduğunu anlamaya çalışıyordum. - Marcin Nabiałek
Laravel üzerinde çalıştığım harika bir çerçeve ama bu kırılma değişiklikleri beni kızdırıyor! Bunu anlamak için çok zaman harcadım, v5.2.0'da 5.2.29'a yükseltildikten sonra mükemmel bir şekilde çalışıyordum, bu hata da başıma geldi, çözüldü \Illuminate\Http\UploadedFile Cevabınız için teşekkürler. - Adriano Rosa
@ MarcinNabiałek MimeType ve boyut değişkeni yapıcıda yanlış yol var. - AndrewMcLagan
@AndrewMcLagan Neden böyle düşünüyorsun? Kurucunun imzası __construct($path, $originalName, $mimeType = null, $size = null, $error = null, $test = false) 1 MIME ve sonra boyutu - Marcin Nabiałek