Here is how you can test the image or file uploads in your PHPUnit feature test in Laravel.

Let' say you have a Post Model in your application which also has an image parameter.

Here is how the PostFactory looks like

/* @var $factory \Illuminate\Database\Eloquent\Factory */

use App\Post;
use Faker\Generator as Faker;

$factory->define(Post::class, function (Faker $faker) {
    $image = 
    return [
        'title' => $faker->sentence,
        'content' => $faker->paragraph,        
        'image' => $faker->image('public/storage/images',640,480, null, false),
    ];
});

Here is how the validation rules looks like

$rules = [
            'title' => 'required',
            'content' => 'required',
            'image' => 'required|image|mimetypes:image/jpeg,image/png,image/jpg'
        ];

If you use the factory method in your phpunit test, The test will fail with error The given data was invalid., since we are only passing the image name and not the actual image for validaiton.

Here is how you can use \Illuminate\Http\UploadedFile::fake() in your tests.

/** @test */
public function admin_user_can_add_new_post(){
   // Given that we have a signed in user
   $this->actingAs($this->user);

   $tag = factory('App\Post')->make(['image' => UploadedFile::fake()->create('test.png', $kilobytes = 0)]);

   $this->post('/admin/tags', $tag->toArray());
             
   $this->assertDatabaseHas('tags', ['name' => $tag->name]);
}

That's all about using UploadedFile to test file uploads in Laravel.

Comments