簡體   English   中英

在 unittest assert_called_with() 中引用嵌套的 function

[英]Reference a nested function in unittest assert_called_with()

如何在MagicMock.<method>.assert_called_with()中引用嵌套函數?

我想模擬一個可以將事件分發到已安裝事件處理程序的 object (此處稱為EventObject )。

處理程序安裝的簽名如下所示:

class EventObject:
    def install_handler(handler_func):
        pass

一個 function 作為事件處理程序安裝一個嵌套的 function:

def setup_handler(event_obj):
    def handle_event():
        pass

    event_obj.install_handler(handle_event)

現在如何測試這個? 我試過了:

def test_listen():
    event_obj = MagicMock(spec=EventObject)
    setup_handler(event_obj)
    event_obj.install_handler.assert_called_with(setup_handler.handle_event)

但這給出了AttributeError: 'function' object has no attribute 'handle_event'

有任何想法嗎?

無法訪問handle_event - 它不是setup_handler的屬性,它只是一個局部變量,因此在 scope 之外無法訪問。 setup_handler之外你只能說install_handler屬性被調用了一些東西,例如使用ANY

def test_listen():
    event_obj = MagicMock(spec=EventObject)
    setup_handler(event_obj)
    event_obj.install_handler.assert_called_with(ANY)

(有關更具體的斷言,請參閱我對為模擬 assert_call_once_with() 指定“class Foo 的任何實例”的回答?您可以改為AnyInstanceOf(Callable) 。)

但是,鑒於該函數被傳遞給install_handler ,現在已被模擬,您可以通過在mock_calls上訪問它並與之交互來測試此 function 是否正確:

def test_listen():
    event_obj = MagicMock(spec=EventObject)
    setup_handler(event_obj)
    handler = event_obj.install_handler.mock_calls[0].args[0]
    # exercise handler

暫無
暫無

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

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