2017-10-19 134 views
0

使用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()

+0

尝试'$这个 - > setExpectedException( “ErrorException”);' – ishegg

+0

@ishegg THX的答复,我修改了问题,包括你的代码,它不工作了。 – Ben

回答

1

那因为你抓住了例外。 PHPUnits expectedException - 方法只注册未处理或重新抛出异常。重新引发catch块中的异常,或者只是测试您在catch块中创建的日志条目。

0

function getDataAndStoreToCSVFile()你只是抛出错误代码和消息的错误。然后你可以在测试用例中使用这些断言。

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