在 unittest assert_called_with() 中引用嵌套函数

Reference a nested function in unittest assert_called_with()

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

我想模拟一个可以将事件分发给已安装的事件处理程序的对象(此处称为 EventObject)。

处理程序安装的签名如下所示:

class EventObject:
    def install_handler(handler_func):
        pass

将嵌套函数安装为事件处理程序的函数:

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的属性,它只是一个局部变量,因此在该范围之外无法访问。在 setup_handler 之外你只能说 install_handler 属性被调用了 something,例如使用 ANY:

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

(请参阅我对 的回答以获得更具体的断言 - 您可以改为 AnyInstanceOf(Callable)。)

但是,鉴于该函数被传递给 install_handler,现在已被模拟,您可以通过在 mock_calls 上访问它并与它:

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