在 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
如何在 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