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

Author: Nemo, 2012-08-23

3 answers

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

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

Https://github.com/mikey179/vfsStream

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

 9
Author: raidenace, 2015-10-01 17:09:11

Да!

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

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

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

 2
Author: Evert, 2012-08-23 00:23:42

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

 2
Author: Steven Scott, 2012-08-28 20:03:44