How to test file upload with laravel and phpunit?

For anyone else stumbling upon this question, you can nowadays do this:

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


In Laravel 6 the constructor of \Illuminate\Http\UploadedFile Class has 5 parameters instead of 6. This is the new constructor:

     * @param string      $path         The full temporary path to the file
     * @param string      $originalName The original file name of the uploaded file
     * @param string|null $mimeType     The type of the file as provided by PHP; null defaults to application/octet-stream
     * @param int|null    $error        The error constant of the upload (one of PHP's UPLOAD_ERR_XXX constants); null defaults to UPLOAD_ERR_OK
     * @param bool        $test         Whether the test mode is active
     *                                  Local files are used in test mode hence the code should not enforce HTTP uploads
     * @throws FileException         If file_uploads is disabled
     * @throws FileNotFoundException If the file does not exist
    public function __construct(string $path, string $originalName, string $mimeType = null, int $error = null, $test = false)
        // ...

So the above solution becomes simply:

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

It works for me.

Docs for CrawlerTrait.html#method_action reads:

string $method
string $action
array $wildcards
array $parameters
array $cookies
array $files
array $server
string $content

So I assume the correct call should be

$response = $this->action(
    ['file' => $uploadedFile]

unless it requires non-empty wildcards and cookies.

The best and Easiest way : First Import the Necessary things

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

Then make a fake file to upload.

$file = UploadedFile::fake()->create('file.pdf');

Then make a JSON Data to pass the file. Example

$parameters =[
            'institute'=>'Allen Peter Institute',

Then send the Data to your API.

$user = User::where('email','[email protected]')->first();

$response = $this->json('post', 'api/user', $parameters, $this->headers($user));


I hope it will work.

With phpunit you can attach a file to a form by using attach() method.

Example from lumen docs:

public function testPhotoCanBeUploaded()
         ->name('File Name', 'name')
         ->attach($absolutePathToFile, 'photo')
         ->see('Upload Successful!');