У меня есть базовый класс, который определяет атрибут класса и некоторые дочерние классы, которые зависят от него, например
class Base(object):
assignment = dict(a=1, b=2, c=3)
Я хочу убрать этот класс с разными назначениями, например. пустой словарь, отдельный элемент и т.д. Это, конечно, очень упрощено, это не вопрос рефакторинга моих классов или тестов.
Тесты (pytest), которые я придумал, в конечном итоге, работают
from .base import Base
def test_empty(self):
with mock.patch("base.Base.assignment") as a:
a.__get__ = mock.Mock(return_value={})
assert len(Base().assignment.values()) == 0
def test_single(self):
with mock.patch("base.Base.assignment") as a:
a.__get__ = mock.Mock(return_value={'a':1})
assert len(Base().assignment.values()) == 1
Это кажется довольно сложным и взломанным - я даже не понимаю, почему он работает (хотя я знаком с дескрипторами). Может ли макет автоматически преобразовывать атрибуты класса в дескрипторы?
Решение, которое будет более логичным, не работает:
def test_single(self):
with mock.patch("base.Base") as a:
a.assignment = mock.PropertyMock(return_value={'a':1})
assert len(Base().assignment.values()) == 1
или просто
def test_single(self):
with mock.patch("base.Base") as a:
a.assignment = {'a':1}
assert len(Base().assignment.values()) == 1
Другие варианты, которые я пробовал, тоже не работают (назначения не изменяются в тесте).
Каков правильный способ издеваться над атрибутом класса? Есть ли лучший/более понятный способ, чем выше?