PHPUnit的测试的ExpectedException不会引发异常
使用Laravel框架PHPUnit的单元测试。PHPUnit的测试的ExpectedException不会引发异常
我与需要的文件被创建的目录被写入到它,总之功能工作,该函数获取数据,将其写入到一个临时文件和移动要做一次临时文件。
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());
}
}
为了测试是否ErrorException当目录丢失被抛出,这个测试:
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();
}
当我运行测试,我的日志表明,我掉进了:
} 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());
}
但我说终端:
1)测试\接口\来源\ IdbStationSourceInterfaceTest :: test_getDataAn dStoreToCSVFile_handles_ErrorException 无法断言类型“ErrorException”的那则抛出异常。
我不知道该从哪里去,我阅读并尝试了几件事情,但显然我做错了什么。
编辑1:
试过函数:$ this-> setExpectedException( “ErrorException”);
,但我得到以下几点:
1)测试\接口\来源\ IdbStationSourceInterfaceTest :: test_getDataAndStoreToCSVFile_handles_ErrorException 错误:调用未定义的方法测试\接口\来源\ IdbStationSourceInterfaceTest :: setExpectedException()
那因为你抓住了例外。 PHPUnits expectedException
- 方法只注册未处理或重新抛出异常。重新引发catch块中的异常,或者只是测试您在catch块中创建的日志条目。
从function getDataAndStoreToCSVFile()
你只是抛出错误代码和消息的错误。然后你可以在测试用例中使用这些断言。
/** *@expectedException ExampleException *@expectedExceptionCode ExampleException::EceptionCode */ public function test_getDataAndStoreToCSVFile_handles_ErrorException() {}
尝试'$这个 - > setExpectedException( “ErrorException”);' – ishegg
@ishegg THX的答复,我修改了问题,包括你的代码,它不工作了。 – Ben