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()
Essayez '$ this-> setExpectedException ("ErrorException");' – ishegg
@ishegg Thx pour la réponse, j'ai modifié la question d'inclure votre code, il ne fonctionne pas. – Ben