При работе с файловой системой в наших наборах тестов большое беспокойство вызывает очистка временных файлов после каждого запуска теста. Однако, если по какой-либо причине выполнение теста прерывается до этапа очистки, дальнейшие тесты могут завершиться неудачей, поскольку среда не была очищена.
В этом посте мы будем использовать библиотеку с именем 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!
Что вы думаете об этом подходе к тестированию операций файловой системы? Вы используете альтернативное решение? Предвидеть какие-либо ограничения, с которыми вы можете столкнуться при использовании этого подхода? Дайте нам знать!
