Как проверить загрузку файлов с помощью laravel и phpunit?

Я пытаюсь запустить этот функциональный тест на моем контроллере laravel. Я бы хотел протестировать обработку изображений, но для этого хочу подделать загрузку изображений. Как мне это сделать? Я нашел несколько примеров в Интернете, но никто не работает для меня. Вот что я имею:

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', 'FileStorageController@store', $values, ['file' => $uploadedFile] ); $readable_response = $this->getReadableResponseObject($response); } 

Но контроллер не получает эту проверку:

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

Таким образом, файл некорректно передается. Как мне это сделать?


Обновить

Основываясь на предложении max.lanin, я также попытался:

 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(); } 

но без успеха. Используемый файл существует, и размер правильный.

Документы для CrawlerTrait.html # method_action читаются:

параметры
string $ method
string $ action
подстановочные знаки массива $
параметры массива $
массив $ cookie
массивы $ files
array $ server
string $ content

Поэтому я предполагаю, что правильный вызов должен быть

 $response = $this->action( 'POST', 'FileStorageController@store', [], $values, [], ['file' => $uploadedFile] ); 

если для этого не требуются непустые подстановочные знаки и файлы cookie.

В качестве побочного примечания это ни в коем случае не единичный тест.

С помощью phpunit вы можете прикрепить файл к форме с помощью метода attach ().

Пример из документов просвета :

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

Для кого-то другого, наткнувшегося на этот вопрос, вы можете теперь делать это:

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

Добавьте аналогичный setUp() в свой setUp() файл:

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

Это подменяет ваш $ _FILES глобальный и пусть Laravel думает, что есть что-то загруженное.