我有一个简单的开放(文件)方法,如果无法在给定路径中打开或创建文件,则应抛出异常:
const ERR_MSG_OPEN_FILE = 'Failed to open or create file at %s';
public function open($filePath)
{
ini_set('auto_detect_line_endings', TRUE);
if (false !== ($this->handler = @fopen($filePath, 'c+'))) {
return true;
} else {
throw new \Exception(
sprintf(self::ERR_MSG_OPEN_FILE, $filePath)
);
}
}
使用PHPUnit和VFSStream进行单元测试:
$structure = [
'sample.csv' => file_get_contents(__DIR__ . '/../sampleFiles/small.csv')
];
$this->root = vfsStream::setup('exampleDir', null, $structure);
$existingFilePath = vfsStream::url('exampleDir') . DIRECTORY_SEPARATOR . 'sample.csv';
$this->file = new File();
$this->file->open($existingFilePath);
上面的设置创建了一个虚拟目录结构,其中包含一个模拟文件(从现有的CSV文件中读取/克隆),这满足open方法打开文件的要求。而且如果我传递一个不同的路径(没有现有文件),它将在同一个虚拟结构中创建。
现在为了覆盖异常,我想将现成的目录添加到现有的结构中,假设一个文件夹属于另一个用户而且我没有写入权限,就像我尝试打开时一样该文件夹中的一个非现有文件,尝试创建一个文件应该失败,open方法应该抛出异常。
唯一的问题是,......我不知道怎么做:D
任何建议,提示和指导将不胜感激:)
答案 0 :(得分:0)
您只需将模拟目录的网址指向错误的路径即可。
$existingFilePath = vfsStream::url('badExampleDir') . DIRECTORY_SEPARATOR . 'incorrect.csv';
考虑到 badExampleDir 从未设置过,您的方法将无法在其中创建文件。