PHPUnit: Как мне издеваться над этой файловой системой?
Рассмотрим следующий сценарий (это не производственный код):
class MyClass {
public function myMethod() {
// create a directory
$path = sys_get_temp_dir() . '/' . md5(rand());
if(!mkdir($path)) {
throw new Exception("mkdir() failed.");
}
// create a file in that folder
$myFile = fopen("$path/myFile.txt", "w");
if(!$myFile) {
throw new Exception("Cannot open file handle.");
}
}
}
Верно, так в чем же проблема? Покрытие кода сообщает, что эта строка не покрыта:
throw new Exception("Cannot open file handle.");
Это правильно, но поскольку я создаю папку выше, логически было бы невозможно, чтобы fopen()
вышел из строя (за исключением, может быть, в экстремальных обстоятельствах, например, на диске на 100%).
Я мог бы игнорировать код из покрытия кода, но это своего рода обман. Могу ли я как-нибудь поиздеваться над файловой системой чтобы он мог распознавать myFile.txt
и имитировать файловую систему, неспособную создать файл?
3 answers
vfsStream
является stream wrapper
для virtual filesystem
, который полезен в модульных тестах для моделирования реальной файловой системы. Вы можете установить его из composer.
Дополнительная информация по адресу:
Да!
Вы должны каким-то образом ввести полный путь и не вызывать sys_get_temp_dir() прямо в этом методе.
Любой несуществующий путь должен вызвать проблему. Для этого вам не нужна VFS.
НО вы получите E_NOTICE (или, возможно, предупреждение?) до того, как сработает исключение. Поэтому вам, вероятно, следует сначала проверить is_writable и создать исключение, если оно возвращает false.
Вы также можете разбить функцию на 2 метода: один для создания пути, а другой для его использования. Затем можно было бы провести отдельные тесты, чтобы убедиться, что путь создан. Второй набор тестов может проверить и зафиксировать исключение при попытке использовать неверный путь.