У меня есть функция, которая рекурсивно ищет файлы .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 делать что хочу, а я просто слепой?
(Я знаю, что могу просто создавать временные файлы, но я бы предпочел не использовать операции ввода-вывода в модульных тестах.)
В данном конкретном случае, я думаю, вы правы. Но с более сложной логикой, например, если я хочу переместить файлы в каталоги на основе части имени файла, я бы хотел это проверить. (Позор мне, я использовал chain(*(p.iterdir() for p in mydir.iterdir())) с filter вместо glob.)
Взгляните на stackoverflow.com/questions/19672138/…
@Gokul Спасибо! Думаю, мне нужно лучше научиться гуглить (: похоже, что pyfakefs из второго ответа - это именно то, что мне нужно.
Используйте glob.glob("**/*.json", recursive=True), так как он из stdlib, тестировать не нужно :)






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