2016-09-16 4 views
5

Я пытаюсь написать тесты для конечной точки, которая ожидает почтовый запрос с прикрепленным CSV-файлом. Я знаю, чтобы имитировать запрос следующего типа:CakePHP/phpunit: как высмеивать загрузку файла

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

Но я не могу понять, как добавить данные файла. Я попытался вручную установив $_FILES массив, но он не работает ...

$_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'); 

Что правильный способ сделать это?

ответ

0

Из того, что я могу сказать, CakePHP магически объединяет содержимое $_FILES, $_POST и т. Д., Поэтому мы получаем доступ к каждому из $this->request->data[...]. И вы можете передать данные в этот массив данных с дополнительным вторым параметром:

$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

Дразнящего ядром PHP функции немного сложнее.

Я думаю, у вас есть что-то подобное в вашей модели сообщений.

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

И у вас есть соответствующий тест, подобный этому.

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

Поскольку вы ничего не загружаете во время тестового процесса, тест всегда терпит неудачу.

Вы должны добавить второе пространство имен в начале вашего PostsTableTest.php, даже имея больше пространств имен в одном файле, является плохой практикой.

<?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; 
} 

Чем вы должны иметь свое первоначальное объявление пространства имен в фигурных скобках.

namespace App\Model\Table { 

И вы можете добавить метод PHP ядра перезапись

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 

Больше на CakePHP модульного тестирования здесь: http://www.apress.com/9781484212134

Смежные вопросы