类上的Mock属性方法

2024-05-18 23:26:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据类:

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'

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


Tags: 方法selfnewreturnfoobarbazmock
1条回答
网友
1楼 · 发布于 2024-05-18 23:26:28

您可以编写自己的属性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
必须有一个更干净的方法来实现这一点,尽管我看不到

相关问题 更多 >

    热门问题