2015-10-22 9 views
13

Próbuję uruchomić ten test funkcjonalny na moim kontroler laravel. Chciałbym przetestować przetwarzanie obrazu, ale żeby to zrobić, chcę sfałszować przesyłanie obrazów. Jak mam to zrobic? Znalazłem kilka przykładów w Internecie, ale żaden nie wydaje się działać dla mnie. Oto co mam:Jak przetestować przesyłanie plików za pomocą laravel i phpunit?

public function testResizeMethod() 
{ 
    $this->prepareCleanDB(); 

    $this->_createAccessableCompany(); 

    $local_file = __DIR__ . '/test-files/large-avatar.jpg'; 

    $uploadedFile = new Symfony\Component\HttpFoundation\File\UploadedFile(
     $local_file, 
     'large-avatar.jpg', 
     'image/jpeg', 
     null, 
     null, 
     true 
    ); 


    $values = array(
     'company_id' => $this->company->id 
    ); 

    $response = $this->action(
     'POST', 
     '[email protected]', 
     $values, 
     ['file' => $uploadedFile] 
    ); 

    $readable_response = $this->getReadableResponseObject($response); 
} 

Ale regulator nie przejdzie ten test:

elseif (!Input::hasFile('file')) 
{ 
    return Response::error('No file uploaded'); 
} 

Więc jakoś plik nie przepuszcza prawidłowo. Jak mam to zrobić?


Aktualizacja

podstawie suggestin max.lanin za, próbowałem też:

public function setUp() 
{ 
    // Tried with parent::setUp() here and at the end 
    // parent::setUp(); 
    $local_file = __DIR__ . '/test-files/large-avatar.jpg'; 

    print($local_file); 

    $_FILES = array(
     'file' => array (
      'tmp_name' => $local_file, 
      'name' => 'large-avatar.jpg', 
      'type' => 'image/jpeg', 
      'size' => 335057, 
      'error' => 0, 
     ), 
     'image' => array (
      'tmp_name' => $local_file, 
      'name' => 'large-avatar.jpg', 
      'type' => 'image/jpeg', 
      'size' => 335057, 
      'error' => 0, 
     ), 
    ); 

    parent::setUp(); 
} 

ale bez sukcesu. Używany plik istnieje, a rozmiar jest poprawny.

+0

widzę już umieścić to w tryb testowy. Czy przesłany plik jest większy niż maksymalny rozmiar pliku ustawiony w php.ini? –

+0

Nie, to nie wszystko, limit przesyłania to 2mb, plik testowy to 300kb. –

Odpowiedz

9

Docs for CrawlerTrait.html#method_action brzmi:

Parametry
ciąg metoda $
string $ akcja
array $ symbole wieloznaczne
array $ parametry
array $ ciasteczka
array $ plików
array $ serwer
string $ content

Więc zakładam prawidłowe połączenie powinno być

$response = $this->action(
    'POST', 
    '[email protected]', 
    [], 
    $values, 
    [], 
    ['file' => $uploadedFile] 
); 

chyba że wymaga niepuste symbole wieloznaczne i ciasteczka.

Na marginesie, nie jest to w żadnym wypadku test jednostka.

+0

Próbowanie sugestii Test żargonu wydaje mi się tak niejasny: p Jakiego rodzaju test będzie to? –

+1

@ JasperKennis, to nie żargon, ale terminologia, która pomaga ludziom pozostać na tej samej stronie, omawiając różne rzeczy, niewłaściwe użycie terminologii myli, i robi coś przeciwnego.To co robisz, to test funkcjonalny lub integracyjny, w zależności od zamiarów Z reguły of kciuka, test jednostki sprawdza część imperatywną, tj. logikę jednej klasy, wyśmiewa wszystko (sensownie) w inny sposób Testy integracyjne sprawdzają część deklaratywną, tj. konfiguracje, szablony itp. Testy funkcjonalne sprawdzają funkcjonalność aplikacji zgodnie z definicją w specyfikacji –

+0

To zadziałało^^ Test nadal kończy się niepowodzeniem, ale wykracza poza określony punkt, w którym utknąłem. Uwaga, używam Laravel 4.2, a to nie weź argument '$ wildcards'. –

4

Dzięki phpunit możesz dołączyć plik do formularza za pomocą metody attach().

Przykład z lumen docs:

public function testPhotoCanBeUploaded() 
{ 
    $this->visit('/upload') 
     ->name('File Name', 'name') 
     ->attach($absolutePathToFile, 'photo') 
     ->press('Upload') 
     ->see('Upload Successful!'); 
} 
+2

To nie pomaga, testuję odpowiedzi kontrolera za pomocą metody 'action'. To jest przykład wyższego poziomu. –

0

Dodaj podobną metodę setUp() do swojej testcase:

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

    $_FILES = array(
     'image' => array(
      'name'  => 'test.jpg', 
      'tmp_name' => __DIR__ . '/_files/phpunit-test.jpg', 
      'type'  => 'image/jpeg', 
      'size'  => 499, 
      'error'  => 0 
     ) 
    ); 
} 

To będzie sfałszować swoją $ _FILES globalny i niech laravel myśleć, że coś jest przesłany.

+0

Próbowałem tego, zarówno nazywania pliku 'image' lub' file', ale czek nadal nie powiedzie się. Czy to ma działać z jednostką testową '-> action'? –

+0

Czy umieściłeś rzeczywisty rozmiar i ścieżkę pliku do tablicy? Spróbuj także przełączać linie, aby parent :: setUp był po podszyciu tablicy $ _FILES. –

+0

Zaktualizowałem moje pytanie, aby to również odzwierciedlić, ale nie, to nie pomogło :(Nazwa pliku i rozmiar są poprawne –

3

dla nikogo innego natrafiają na to pytanie, można w dzisiejszych czasach to zrobić:

$response = $this->postJson('/product-import', [ 
     'file' => new \Illuminate\Http\UploadedFile(resource_path('test-files/large-avatar.jpg'), 'large-avatar.jpg', null, null, null, true), 
    ]); 
+0

Do dodania dodaję konstruktor '__construct ($ path, $ originalName, $ mimeType = null, $ size = null, $ error = null, $ test = false)' który zostanie wywołany z powyższego kodu. Działa doskonale w przypadku obrazów i plików PDF w testach jednostkowych. – barfoos

0

Oto pełna przykład jak test z plików niestandardowych. Potrzebowałem tego do parsowania plików CSV o znanym formacie, więc moje pliki musiały mieć dokładne formatowanie i zawartość. Jeśli potrzebujesz tylko obrazów lub plików o losowych rozmiarach, użyj metod $ file-> fake-> image() lub create(). Te są dostarczane w pakiecie z Laravel.

namespace Tests\Feature; 

use Tests\TestCase; 
use Illuminate\Http\UploadedFile; 
use Illuminate\Support\Facades\Storage; 

class PanelistImportTest extends TestCase 
{ 
    /** @test */ 
    public function user_should_be_able_to_upload_csv_file() 
    { 
     // If your route requires authenticated user 
     $user = Factory('App\User')->create(); 
     $this->actingAs($user); 

     // Fake any disk here 
     Storage::fake('local'); 

     $filePath='/tmp/randomstring.csv'; 

     // Create file 
     file_put_contents($filePath, "HeaderA,HeaderB,HeaderC\n"); 

     $this->postJson('/upload', [ 
      'file' => new UploadedFile($filePath,'test.csv', null, null, null, true), 
     ])->assertStatus(200); 

     Storage::disk('local')->assertExists('test.csv'); 
    } 
} 

Oto kontroler iść z nim:

namespace App\Http\Controllers; 

use Illuminate\Http\Request; 
use App\Http\Controllers\Controller; 
use Illuminate\Support\Facades\Storage; 

class UploadController extends Controller 
{ 
    public function save(Request $request) 
    { 
     $file = $request->file('file'); 

     Storage::disk('local')->putFileAs('', $file, $file->getClientOriginalName()); 

     return response([ 
      'message' => 'uploaded' 
     ], 200); 
    } 
} 
Powiązane problemy