Как протестировать работу с каталогами с помощью pathlib

У меня есть функция, которая рекурсивно ищет файлы .json в каталоге. Он использует pathlib.

def search(where: Path) -> List[Path]: ...

Я хочу провести модульное тестирование, поэтому мне нужно создать поддельный объект Path с дочерними элементами, чтобы fake_path.iterdir() и fake_path.resolve() работали.

В идеале я хочу вот это:

topdir = FakePath()
subdir1 = FakePath()
subdir1.add_children(Path('file1'), Path('file2'))
topdir.add_children(subdir1)

for dir in topdir.iterdir():
    for file in dir.iterdir():
        print(file.name)

>> file1
>> file2

и после этого он будет вести себя как обычный объект Path.

Есть ли библиотека, которая это делает? Или может pathlib делать что хочу, а я просто слепой?

(Я знаю, что могу просто создавать временные файлы, но я бы предпочел не использовать операции ввода-вывода в модульных тестах.)

Я бы сказал: не надо. pathlib уже хорошо протестирован и зарекомендовал себя. Я не вижу, что добавляет функция search(), особенно учитывая, что ее интерфейс идентичен базовому вызову pathlib (вы находятся используете glob(), верно?)

smassey 07.04.2018 09:35

В данном конкретном случае, я думаю, вы правы. Но с более сложной логикой, например, если я хочу переместить файлы в каталоги на основе части имени файла, я бы хотел это проверить. (Позор мне, я использовал chain(*(p.iterdir() for p in mydir.iterdir())) с filter вместо glob.)

ptz 07.04.2018 09:46

Взгляните на stackoverflow.com/questions/19672138/…

Gokul 07.04.2018 10:57

@Gokul Спасибо! Думаю, мне нужно лучше научиться гуглить (: похоже, что pyfakefs из второго ответа - это именно то, что мне нужно.

ptz 07.04.2018 11:04

Используйте glob.glob("**/*.json", recursive=True), так как он из stdlib, тестировать не нужно :)

Dima Tisnek 02.10.2019 05:16
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
271
0

Другие вопросы по теме