При работе с файловой системой в наших наборах тестов большое беспокойство вызывает очистка временных файлов после каждого запуска теста. Однако, если по какой-либо причине выполнение теста прерывается до этапа очистки, дальнейшие тесты могут завершиться неудачей, поскольку среда не была очищена.
В этом посте мы будем использовать библиотеку с именем vfsStream для создания макетов файловой системы. Это немного больше, чем обертка вокруг виртуальной файловой системы , которая также очень хорошо работает с PHPUnit .
Примечание. Этот пост требует базового понимания модульного тестирования и PHPUnit .
Чтобы что-то протестировать, мы напишем простой класс для создания файлов:
<?php namespace App\Tests; class FileCreator extends PHPUnit_Framework_TestCase { public static function create($path, $name, $content) { $file_name = rtrim($path, '/') . '/' . $name; if (file_put_contents($filename, $content)) { return true; } return false; } }
Внутри класса у нас есть метод create()
, который принимает имя файла, содержимое и путь для его сохранения.
Чтобы протестировать класс, мы сначала используем традиционный подход и создаем тестовый класс без использования виртуальной файловой системы. Затем мы добавим vfsStream в игру, чтобы увидеть, как она может упростить для нас процесс тестирования.
Традиционный подход
<?php namespace App\Tests; class FileCreatorTest extends PHPUnit_Framework_TestCase { protected $path; public function setUp() { $this->path = sys_get_temp_dir(); } public function tearDown() { if (file_exists($this->path . '/test.txt')) { unlink($this->path . '/test.txt'); } } public function testCreate() { $this->assertTrue(FileCreator::create($this->path, 'test.txt', 'Lorem ipsum dolor sit amet')); $this->assertFileExists($this->path . '/test.txt'); } }
Выше мы определяем временный каталог (в setUp()
), который мы будем использовать для наших временных файлов, используя PHP sys_get_temp_dir()
. Функция возвращает системный путь к каталогу для временных файлов.
Затем мы проверяем функциональность нашего класса, делая два утверждения и, наконец, tearDown()
среду (в tearDown()
) для следующего набора тестов.
Там нет ничего плохого с этим кодом в его текущем состоянии. Но что если нам нужно работать с большим количеством файлов в каждом тесте? Что если код сломается, прежде чем мы получим возможность удалить временные файлы? У vfsStream есть ответы на эти вопросы.
Использование vfsStream
В этом разделе мы перепишем FileCreatorTest
с помощью vfsStream.
Для его установки мы используем Composer:
composer require mikey179/vfsStream
Вот тестовый класс с vfsStream:
<?php use org\bovigo\vfs\vfsStream; class FileCreatorTest extends PHPUnit_Framework_TestCase { /** * @var org\bovigo\vfs\vfsStreamDirectory */ protected $vfs; public function setUp() { // Setting up vfsStream in our test class $this->vfs = vfsStream::setup('testDirectory'); } public function testCreate() { $this->assertTrue(FileCreator::create(vfsStream::url('testDirectory'), 'test.txt', 'Lorem ipsum dolor sit amet')); $this->assertFileExists($this->vfs->getChild('test.txt')->url()); } }
В setUp()
мы настраиваем vfsStream, вызывая vfsStream::setup()
. Этот метод устанавливает vfsStream и возвращает экземпляр vfsStreamDirectory
. Это наш каталог контейнеров .
Контейнер каталогов на самом деле представляет собой макет файловой системы с одним основным каталогом, называемым testDirectory
.
В первом утверждении мы передаем основной виртуальный путь (используя vfsStream::url()
) в FileCreator::create()
вместе с именем файла и его содержимым:
<?php // ... $this->assertTrue(FileCreator::create(vfsStream::url('testDirectory'), 'test.txt', 'Lorem ipsum dolor sit amet'));
В следующем утверждении мы проверяем существование test.txt
. Для этого мы извлекаем объект файла ( test.txt
) из контейнера каталога и получаем его полный путь:
<?php // ... $this->assertFileExists($this->vfs->getChild('test.txt')->url());
Как видите, в нашем тестовом классе нет никаких признаков очистки, поскольку все операции файловой системы (создание и очистка) обрабатываются vfsStream. Если по какой-либо причине код нарушается, по-прежнему нет необходимости выполнять очистку, поскольку все происходит в памяти.
Вывод
Помимо того, что мы видели здесь, vfsStream может предложить гораздо больше, в том числе обработку разрешений, владение, обработку больших файлов и сложных структур каталогов и т. Д. Чтобы узнать больше об этом, ознакомьтесь с их официальной документацией или дождитесь некоторые предстоящие продвинутые учебники на SitePoint!
Что вы думаете об этом подходе к тестированию операций файловой системы? Вы используете альтернативное решение? Предвидеть какие-либо ограничения, с которыми вы можете столкнуться при использовании этого подхода? Дайте нам знать!