2016-09-16 44 views
5

Próbuję pisać testy dla punktu końcowego, który oczekuje żądania postu z załączonym plikiem CSV. Wiem, aby symulować żądania POST takiego:CakePHP/phpunit: jak kpić z wysyłania pliku

$this->post('/foo/bar'); 

Ale nie mogę dowiedzieć się, jak dodać dane pliku. Próbowałem ręcznie ustawiając tablicę $_FILES ale to nie działa ...

$_FILES = [ 
     'csvfile' => [ 
      'tmp_name' => '/home/path/to/tests/Fixture/csv/test.csv', 
      'name' => 'test.csv', 
      'type' => 'text/csv', 
      'size' => 335057, 
      'error' => 0, 
     ], 
]; 
$this->post('/foo/bar'); 

Jaki jest właściwy sposób to zrobić?

Odpowiedz

0

Z tego, co wiem, CakePHP magicznie łączy zawartość $_FILES, $_POST itd., Więc uzyskujemy dostęp do każdej z nich od $this->request->data[...]. I możesz przekazać informacje do tej tablicy danych z opcjonalnym drugim parametrem:

$data = [ 
     'csvfile' => [ 
      'tmp_name' => '/home/path/to/tests/Fixture/csv/test.csv', 
      'name' => 'test.csv', 
      'type' => 'text/csv', 
      'size' => 45, 
      'error' => 0, 
     ], 
]; 
$this->post('/foo/bar', $data); 
1

Kpiny z podstawowych funkcji PHP jest trochę trudne.

Chyba masz coś takiego w swoim modelu postów.

public function processFile($file) 
{ 
    if (is_uploaded_file($file)) { 
     //process the file 
     return true; 
    } 
    return false; 
} 

Masz odpowiedni test podobny do tego.

public function testProcessFile() 
{ 
    $actual = $this->Posts->processFile('noFile'); 
    $this->assertTrue($actual); 
} 

Ponieważ nie przesyłasz niczego podczas procesu testowania, test zawsze kończy się niepowodzeniem.

Powinieneś dodać drugą przestrzeń nazw na początku swojego PostsTableTest.php, nawet mając więcej przestrzeni nazw w jednym pliku, jest to zła praktyka.

<?php 
namespace { 
    // This allows us to configure the behavior of the "global mock" 
    // by changing its value you switch between the core PHP function and 
    // your implementation 
    $mockIsUploadedFile = false; 
} 

Niż powinieneś mieć oryginalną deklarację przestrzeni nazw w formacie nawiasów klamrowych.

namespace App\Model\Table { 

i można dodać metodę rdzenia PHP zostać nadpisane

function is_uploaded_file() 
{ 
    global $mockIsUploadedFile; 
    if ($mockIsUploadedFile === true) { 
     return true; 
    } else { 
     return call_user_func_array('\is_uploaded_file',func_get_args()); 
    } 
} 

//other model methods 

} //this closes the second namespace declaration 

Więcej na jednostkę testowania CakePHP tutaj: http://www.apress.com/9781484212134