我具有以下数据类:
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
,patch
等各种组合,但是我看到了:
TypeError: _unbound() missing 1 required positional argument: 'self'
是否有一种方法可以使用包含对数据类的引用的绑定方法来模拟出属性?
答案 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
。
必须实现一种更清洁的方式来实现这一目标,尽管我看不到...