2017-10-19 31 views
0

Utilisation du framework Laravel avec phpunit pour les tests unitaires. Je travaille avec une fonction qui nécessite la création de répertoires pour l'écriture d'un fichier, bref, la fonction obtient des données, l'écrit dans un fichier temporaire et déplace le fichier temporaire une fois terminé.Test PHPUnit ExpectedException ne lançant pas d'exception

public function getDataAndStoreToCSVFile() { 
    Log::info(date('Y-m-d H:i:s') . " -> " . __FILE__ . "::" . __FUNCTION__); 
    try { 
     // make sure directories exist 
     if (!Storage::has($this->temporary_directory) || !Storage::has($this->storage_directory)) { 
      $this->createDirectories(); 
     } 

     // get full path of storage disk for files 
     $diskPath = Storage::getAdapter()->getPathPrefix(); 

     // create a complete path to temporary file to allow tempnam to find the directory 
     $full_temporary_file_path = $diskPath.$this->temporary_directory; 

     // fetch stations, station networks and station params seperated by double new line, 
     // will return FALSE if something is missing and file will not be created and not written to 
     if($stations_data_array = $this->getCompleteStationsDataArray("\n\n")){ 

      // create temporary file 
      $temporary_file = tempnam($full_temporary_file_path,'') ; 

      // if both $temporary_file and $stations_data_array exist write entries to file one at a time in CSV format 
      if (file_exists($temporary_file)) { 
       $fp = fopen($temporary_file, 'a'); 
       foreach ($stations_data_array as $fields) { 
        if (is_object($fields) || is_array($fields)) { 

         // $fields is an array 
         $fields = (array)$fields; 
         fputcsv($fp, $fields); 
        } else { 

         // $fields is the separator 
         fwrite($fp, $fields); 
        } 
       } 

       // done writing, close file 
       fclose($fp); 

       // create new permanent name for $temporary_file in the storage directory "full_disk_path.storage_path.yyyymmddhhmmss.timestamp" 
       $storage_file = $diskPath . $this->storage_directory . "/" . date('YmdHis') . "." . time(); 

       // rename $temporary_file to $storage_file 
       if (!rename($temporary_file, $storage_file)) { 
        Log::error(__FILE__ . "::" . __FUNCTION__ . " : Failed to move temporary file from " . $this->temporary_directory . " to " . $this->storage_directory); 
       } 
      } else{ 
       Log::error(__FILE__ . "::" . __FUNCTION__ . " : Temporary file was not available or does not exist."); 
      } 
     } else { 
      Log::error(__FILE__ . "::" . __FUNCTION__ . " : Temporary file was not created."); 
     } 
    } catch (\ErrorException $e) { 
     // Catches missing directory or file, or tempnam couldn't find temporary storage path //Todo add test for this exception 
     Log::error(__FILE__ . "::" . __FUNCTION__ . " : " . $e->getMessage()); 
    } catch (\Exception $e) { 
     // Catches uncaught exceptions 
     Log::error(__FILE__ . "::" . __FUNCTION__ . " : " . $e->getMessage()); 
    } 
} 

Pour tester si ErrorException est levée lorsque les répertoires manquent, ce test:

public function test_getDataAndStoreToCSVFile_handles_ErrorException() { 

    // set up data 
    $this->setup_all_data_for_getDataAndStoreToCsvFile_funtion(); 

    // mock class 
    $mock = $this->getMockBuilder('App\Interfaces\Sources\IdbStationSourceInterface') 

    // stub function createDirectories, will now return null and not create directories, missing directories will throw ErrorException 
    ->setMethods(['createDirectories']) 
    ->getMock(); 

    // expect the ErrorException to be thrown 
    $this->expectException('ErrorException'); 

    // run function 
    $mock->getDataAndStoreToCSVFile(); 
} 

Quand je lance le test, mes journaux indiquent que je suis tombé dans:

} catch (\ErrorException $e) { 
     // Catches missing directory or file, or tempnam couldn't find temporary storage path //Todo add test for this exception 
     Log::error(__FILE__ . "::" . __FUNCTION__ . " : " . $e->getMessage()); 
} 

Mais mon terminal dit:

1) Tests \ Interfaces \ Sources \ IdbStationSourceInterfaceTest :: test_getDataAn dStoreToCSVFile_handles_ErrorException Echec de l'affichage de l'exception de type "ErrorException". Je n'ai aucune idée où aller à partir de là, j'ai lu et essayé quelques choses mais clairement je fais quelque chose de mal.

Edit 1:

Essayé: $ this-> setExpectedException ("ErrorException");

Mais je reçois le texte suivant:

1) Tests \ Interfaces \ Sources \ IdbStationSourceInterfaceTest :: test_getDataAndStoreToCSVFile_handles_ErrorException Erreur: Appel à la méthode non défini Tests \ Interfaces \ Sources \ IdbStationSourceInterfaceTest :: setExpectedException()

+0

Essayez '$ this-> setExpectedException ("ErrorException");' – ishegg

+0

@ishegg Thx pour la réponse, j'ai modifié la question d'inclure votre code, il ne fonctionne pas. – Ben

Répondre

1

Cest parce que vous avez attrapé l'exception. PHPUnits expectedException -method enregistre uniquement les exceptions non gérées ou renvoyées. Soit rethrow l'exception dans votre bloc catch ou un test juste pour vous créez journal d'entrée dans le bloc catch.

0

de function getDataAndStoreToCSVFile() vous jetez simplement erreur avec le code d'erreur et un message. Vous pouvez ensuite utiliser ces assertions dans un scénario de test.

/** *@expectedException ExampleException *@expectedExceptionCode ExampleException::EceptionCode */ public function test_getDataAndStoreToCSVFile_handles_ErrorException() {}