簡體   English   中英

python unittest.mock.patch 奇怪的行為

[英]python unittest.mock.patch strange behaviour

我在測試中使用單元測試。 我在yhab.main package 中導入一個 class 作為...

from yhab.blah import SomeClass

def some_func():
    some_instance = SomeClass()
    return some_instance.method()

yhab.blah.SomeClass 定義為...

class SomeClass:
    def method(self):
        return 'hello'

然后我寫一個這樣的測試......

@mock.patch('yhab.blah.SomeClass')
def test_mock_of_blah_someclass(mock_some_class):
    assert some_func() != 'hello'

method()的調用調用真實實例,而不是模擬。

但如果我這樣做...

@mock.patch('yhab.main.SomeClass')
def test_mock_of_main_someclass(mock_some_class):
    assert some_func() != 'hello'

method()的調用調用模擬,而不是真實實例並且測試通過。

這是為什么?

我在想 python 必須在導入發生時制作 class 定義的某種副本,但我寫了一個測試證明情況並非如此。

文檔說了以下內容,這有點難以理解,但它並沒有真正直截了當地說出來,IMO 也沒有真正解釋它,特別是對於 python newb ...

修補 class 會用 MagicMock 實例替換 class。 如果 class 在被測代碼中被實例化,那么將使用模擬的 return_value

文檔是否需要更新才能清楚?

yhab.blah導入SomeClass后,它最終位於yhab.main命名空間中,而不是在yhab.blah命名空間中。

嘗試使用@mock.patch('yhab.main.SomeClass')而不是@mock.patch('yhab.blah.SomeClass')

暫無
暫無

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

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