类上的Mock属性方法



我有以下数据类:

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)

在创建patch对象时,我尝试了new_callablenew等的各种组合,但我看到:

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

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

您可以编写自己的属性mock,它可以在__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
必须有一种更清洁的方法来实现这一点,尽管我不认为…

最新更新