[英]Unable to patch an object's attribute correctly
我有一個 Python 模塊,如下所示:
# src/exec.py
class A:
def run(self, stuff):
b = B(stuff.x)
class B:
def __init__(self, x):
self.obj = self.create_some_obj()
我正在嘗試獨立測試A
類的一部分,為此我需要用假對象替換B
的obj
。 我這樣做如下:
# test/test_execs.py
import exec as ex
class FakeObjForB:
def __init__(self):
# some init
class TestClass:
@patch.object(ex.B, 'obj', FakeObjForB())
def test_with_fake_obj(self):
a = ex.A()
a.run()
# assert something about the state of a that depends on the b inside its run method
運行這個測試給了我錯誤: AttributeError: <class 'B'> does not have the attribute 'obj'
。 我嘗試用@patch.object(ex.B, 'obj', FakeObjForB(), create=True)
用@patch
裝飾器替換該行。 然而,這會導致b.obj
使用實際定義,而不是FakeObjForB
,這反過來導致test_with_fake_obj
中的斷言錯誤失敗。 關於我在這里做錯了什么的任何線索?
在您的示例中,您正在修補 B 類,即作為第一個參數傳遞的對象。 該類沒有在類級別聲明obj
屬性,因此會引發 AttributeError 。 當您提供create=True
它不會抱怨,因為該參數允許在需要/訪問時動態創建obj
屬性。 但是,這永遠不會發生,因為該屬性的第一個“訪問”是它的實際創建——從未發生過動態模擬。
一種解決方案是實際修補其返回值將分配給obj
屬性的方法,例如:
@patch.object(ex.B, 'create_some_obj', FakeObjForB())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.