类的模拟属性方法

时间:2020-03-25 22:49:11

标签: python unit-testing

我具有以下数据类:

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对象时,我尝试了newpatch等各种组合,但是我看到了:

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

是否有一种方法可以使用包含对数据类的引用的绑定方法来模拟出属性?

1 个答案:

答案 0 :(得分:1)

您可以编写自己的属性模拟,该模拟可以在__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
必须实现一种更清洁的方式来实现这一目标,尽管我看不到...