簡體   English   中英

無法正確修補對象的屬性

[英]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類的一部分,為此我需要用假對象替換Bobj 我這樣做如下:

# 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.

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