Мокинг файловой системы в Node.js

Недавно я создал утилиту командной строки на JavaScript, которая анализирует файловую систему. Я изучал варианты написания модульных тестов для утилиты. Поскольку утилита просматривает файловую систему (каталоги и файлы), одним из вариантов было создание необходимых каталогов и файлов с помощью модуля узла fs до начала выполнения тестов и их удаление после завершения выполнения тестов.

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

Изучая альтернативный подход, я наткнулся на mock-fs. Как упоминалось на странице github, эта библиотека позволяет нам имитировать fs модуль, чтобы использовать память как файловую систему вместо фактической файловой системы. Это позволяет нам запускать тесты для набора фиктивных файлов и каталогов вместо того, чтобы таскать с собой кучу тестовых приспособлений.

Пример

Чтобы смоделировать файловую систему, нам нужно вызвать функцию mock, предоставленную mock-fs, со структурой файловой системы, которую мы хотим создать.

import mock from 'mock-fs'
mock({
  'sample-file.txt': 'This is file content',
  'path': {
    'to': {
      'sub-dir': {
        'another-file.md': 'Markdown content'
      }
    }
  }
})

Приведенный выше код создаст в памяти временную файловую систему с sample-file.txt в текущем каталоге и another-file.md в path/to/sub-dir каталоге в текущем каталоге.

Как вы могли заметить, если значение config равно string, то в результате будет получен файл с соответствующими key в качестве имени файла и value в качестве содержимого файла. Если значение конфигурации - object, то результатом будет каталог.

После того, как макет настроен, мы можем использовать обычный модуль fs и его apis для выполнения любых файловых операций над смоделированной файловой системой, как обычно.

Когда мы закончим тестирование, нам нужно восстановить fs привязку к реальной файловой системе с помощью функции restore.

mock.restore()

Заключение

Я считаю, что имитация файловой системы с использованием mock-fs - это более чистый, гибкий и легкий подход при написании тестов для кода, работающего с файловой системой.

Пожалуйста, обратитесь к официальной странице github mock-fs для получения подробных API и некоторых доступных дополнительных параметров конфигурации.

Поделитесь, если вы использовали или знаете об альтернативных подходах, а также о их плюсах и минусах.