Метод фиктивного свойства в классе - PullRequest
1 голос
/ 26 марта 2020

У меня есть следующий класс данных:

from dataclasses import dataclass

@dataclass
class Foo:
    bar: str
    baz: str

    @property
    def qux(self) -> str:
        return self.bar

Я бы хотел изменить поведение qux во время тестирования. Мне известно о PropertyMock, и я мог бы написать что-то вроде:

with mock.patch("__main__.Foo.qux", new_callable=mock.PropertyMock(return_value="test")):
    foo = Foo(bar="a", baz="b")
    print(foo.qux)

Вместо этого я хотел бы заменить метод свойства (недекорированный) на что-то вроде:

def _unbound(self) -> str:
    return self.baz

with mock.patch("__main__.Foo.qux", new_callable=mock.PropertyMock(new=_unbound)):
    foo = Foo(bar="a", baz="b")
    print(foo.qux)

Я пробовал различные комбинации new_callable, new, et c. при создании объекта patch, но я вижу:

TypeError: _unbound() missing 1 required positional argument: 'self'

Есть ли способ смоделировать свойство с помощью связанного метода, содержащего ссылку на класс данных?

1 Ответ

1 голос
/ 26 марта 2020

Вы можете написать свой собственный макет свойства, который делает то, что вы хотите в __get__:

class MyMock(mock.PropertyMock):
    def __get__(self, obj, obj_type=None):
        return _unbound(obj)


def test_unbound():
    with mock.patch("__main__.Foo.qux", new=MyMock()):
        foo = Foo(bar="a", baz="b")
        assert foo.qux == "b"

Проблема состоит в том, чтобы получить правильный объект в _unbound.
Должно быть более чистый способ добиться этого, хотя я этого не вижу ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...