У меня есть простой метод открытия (файл), который должен вызвать исключение, если он не может открыть или создать файл по указанному пути:
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 должен выдать исключение.
Единственная проблема, …. я не знаю, как это сделать: D
Любые советы, подсказки и рекомендации будут оценены 🙂
Вы можете просто указать неверный путь в URL вашего каталога.
$existingFilePath = vfsStream::url('badExampleDir') . DIRECTORY_SEPARATOR . 'incorrect.csv';
принимая во внимание badExampleDir никогда не был настроен ваш метод не сможет создать файл в нем.
Других решений пока нет …