Сохраняйте pathlib.(Posix)Путь, исправленный pyfakefs при его подклассировании

#python #python-3.x #inheritance #pathlib #pyfakefs

Вопрос:

Я PosixPath разделил этот путь на подклассы:

 from pathlib import PosixPath


class Node(PosixPath):

    def __new__(cls, *args, mykwarg=None, **kwargs):
        self = super().__new__(cls, *args, **kwargs)
        self._mykwarg = mykwarg
        return self
 

и добавил несколько @property методов.

Теперь, если я хочу его протестировать (я им пользуюсь pytest ), он не работает:

 def test_Node(fs):
    fs.create_file('simple.txt')
    n = Node('simple.txt')
    n.stat()
 

Запуск тестовых выходов (в строке n.stat() ):

 E   FileNotFoundError: [Errno 2] No such file or directory: 'simple.txt'
 

что не является полностью неожиданным, так как, я полагаю, только PosixPath исправлено pyfakefs , но не моим собственным классом, даже если он унаследован от PosixPath меня .

Но мне хотелось бы иметь возможность протестировать свой класс, сохраняя при этом функции pyfakefs . Имейте методы, поля и т. Д. , Унаследованные от PosixPath все еще исправленных pyfakefs как есть PosixPath , и только те свойства, которые я добавил, не исправлены. Есть ли какой-нибудь способ сделать это?

Ответ №1:

Проблема здесь в том, что Node она получена PosixPath во время загрузки, пока pathlib еще не исправлена, и она не будет исправлена, потому что исправление выполняется по имени модуля. Если вы хотите , чтобы он был получен из исправленного PosixPath , определение класса должно быть перезагружено после начала исправления. Поскольку вы используете pytest , лучший способ, вероятно, — написать свое собственное приспособление, которое делает это:

 import pytest
from pyfakefs.fake_filesystem_unittest import Patcher
import node  # assuming Node lives in node.py

@pytest.fixture
def my_fs():
    with Patcher(modules_to_reload=[node]) as p:
        yield p.fs

def test_Node(my_fs):
    ...
 

Аргумент modules_to_reload предназначен именно для такого рода проблем.

Отказ от ответственности: Я являюсь участником pyfakefs.