簡體   English   中英

Python:使用@patch 在方法中模擬類的實例

[英]Python: Mocking an instance of a class inside a method using @patch

我在 Python 中有一個方法foo可以創建一個服務類。 我想模擬 Service 類,但是當我運行測試時,它仍然嘗試實例化該類。 這是我的設置的簡化版本:

class Service:
    def __init__(self, service):
        self.service_stuff = service

    def run_service(self):
        do_service_stuff()

def foo:
    new_service = Service("bar")
    new_service.run_service()

然后我的單元測試:

@patch('mymodule.service_file.Service')
def test_foo(self, mock_service):
    foo()

我想運行 foo,但讓它使用我的模擬對象而不是創建實際的 Service 實例,但是當我運行它時,它會嘗試實例化 Service() 的實際實例並像往常一樣運行 foo()它似乎可以識別我放入補丁中的字符串簽名。 為什么會這樣?

弄清楚了:對類的補丁引用必須是方法本身中的導入名稱,而不是原始類,類似於https://stackoverflow.com/a/32461515/4234853

所以補丁應該看起來像: @patch('mymodule.foo_file.Service')而不是試圖直接修補類。

在這種情況下,使您的函數更易於測試可能會更容易:

def foo(cls=Service):
    new_service = cls("bar")
    new_service.run_service()

那么你的測試不需要修補任何東西。

def test_foo(self):
    mock_service = Mock()
    foo(mock_service)

暫無
暫無

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

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