Check upload with PHPUnit in Laravel

I am currently trying to test file upload using PHPUnit for Laravel. After some searching, I found the first solution:

$file = new \Symfony\Component\HttpFoundation\File\UploadedFile(
            app_path() . '/tests/Files/default.png', 'default.png');

$response = $this->call('POST', 'students', 
                [
                   'firstname' => 'firstname', 
                   'lastname'  => 'lastname', 
                   'promotion' => '2016', 
                   'isCoop' => 1
                ], 
                [
                   'avatar' => [$file]
                ]
);

      

It works, but it fails when I push this code on Travis and I'm not sure if it's very clean for that ...

You can see that my test failed here .

Thank.

+3


source to share


3 answers


You should use a virtual filesystem for your tests. Check the mocking filesystem in phpunit documentation



+3


source


You can use this class \Illuminate\Http\UploadedFile

to test your upload file as you can see in this.

my work using test case:

public function testUploadLanscapseValid()
{
  $uploadFile= new \Illuminate\Http\UploadedFile(
      base_path()."/resources/fakerFile/mobileScreen/bg_land.jpg", //path image
      'example.jpg',
      'image/jpeg',
      filesize(base_path()."/resources/fakerFile/mobileScreen/bg_land.jpg"), // file size
      null,
      true
  );

  //checking UI validation response
  $this->visit('/mobile-screen')
      ->attach($uploadFile, 'image-landscape')
      ->press('upload-image-landscapse')
      ->seePageIs('/mobile-screen')
      ->see('Mobile screen successfully uploaded.');

  //checking database is inserted
  $this->seeInDatabase('mobile_screen',['link_lanscapse'=>'bg_land.jpg']);

  //checking file exist
  if(file_exists(base_path() . '/public/mobileScreen/bg_land.jpg')){
    $this->assertTrue(true);
  }else{
    $this->assertTrue(false);
  }


}

      

when you test upload using file use \Illuminate\Http\UploadedFile

instead\Symfony\Component\HttpFoundation\File\UploadedFile



UPDATE when I see your test, I think it is incomplete, you can get your test's answer, for example here:

public function testUploadFunctionalTest()
{
  $uploadedFile= new \Illuminate\Http\UploadedFile(
      base_path()."/resources/fakerFile/mobileScreen/bg_land.jpg", //path image
      'example.jpg',
      'image/jpeg',
      filesize(base_path()."/resources/fakerFile/mobileScreen/bg_land.jpg"), // file size
      null,
      true
  );

  // you can use this or
  $parameters = [];
  $response = $this->action(
      'POST',
      'AdminWeb\MobileScreenController@store',
      [],
      $parameters,
      [],
      ['image' => $uploadedFile]
  );

  // you can use this choose One !
  $response  =$this->call('POST', 'mobile-screen@store',
            [
               'firstname' => 'firstname',
               'lastname'  => 'lastname',
               'promotion' => '2016',
               'isCoop' => 1
            ],
            [
               'image' => [$uploadedFile]
            ]);

  $result = json_decode($response->content()); // you can dump or whatever you want with the test
  var_dump($result->your_response);
  $this->assertEquals($result->your_response,'expected output');
}

      

Note. I am using laravel 5.2 and this test will write a file on your disk

0


source


$ file = new \ Symfony \ Component \ HttpFoundation \ File \ UploadedFile (app_path (). '/tests/Files/default.png', 'default.png', "image / jpeg", null, null, true);

-2


source







All Articles