#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.