簡體   English   中英

類上的模擬屬性方法

[英]Mock property method on class

我有以下數據類:

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'

有沒有辦法可以使用包含對數據類的引用的綁定方法來模擬屬性?

您可以編寫自己的屬性模擬,在__get__中執行您想要的__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
必須有一種更清潔的方法來實現這一目標,盡管我沒有看到......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM