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 файловую систему, чтобы она могла распознать myFile.txt и myFile.txt файловую систему, неспособную создать файл?

vfsStream – это stream wrapper для virtual filesystem которая полезна в модульных тестах, чтобы имитировать реальную файловую систему. Вы можете установить его из композитора .

Дополнительная информация:

https://github.com/mikey179/vfsStream

https://phpunit.de/manual/current/en/test-doubles.html

Вы также можете разбить функцию на 2 метода: один для создания пути, а другой – для использования. Затем можно было бы провести индивидуальные тесты, чтобы обеспечить создание пути. Второй набор тестов может проверять и фиксировать исключение, когда вы пытаетесь использовать плохой путь.

Да!

Вы должны каким-то образом ввести полный путь и не называть sys_get_temp_dir () в этом методе.

Любой несуществующий путь должен вызвать проблему. Для этого вам не нужна VFS.

НО вы получите E_NOTICE (или предупреждение, возможно?) До того, как будет запущено исключение. Поэтому вы должны сначала проверить is_writable и выбросить исключение, если оно вернет false.