函数使用lambda参数时如何使用模拟

问题描述

我正在测试一些使用来自Amazon的pysqld库的代码函数之一是execute_lambda,它接受​​一个lambda作为参数(这是您可以传递一些函数来执行的事务)。

我正在尝试模拟此调用,但无法确定参数。让我们看一个例子:

with session() as s:

    s.execute_lamda(lambda x: function(param1,param2))

当我去测试时,检查一下模拟通话:

(Pdb) self.mocks["pyqldb"]["mock"]().get_session().__enter__().execute_lambda.mock_calls
[call(<function init_schema.<locals>.<lambda> at 0x7fd80c97a4d0>,<function init_schema.<locals>.<lambda> at 0x7fd80c97a200>),call(<function init_schema.<locals>.<lambda> at 0x7fd80c97a5f0>,<function init_schema.<locals>.<lambda> at 0x7fd80c97a680>),call(<function init_schema.<locals>.<lambda> at 0x7fd80c97a7a0>,<function init_schema.<locals>.<lambda> at 0x7fd80c97a710>),call(<function init_schema.<locals>.<lambda> at 0x7fd80c97a8c0>,<function init_schema.<locals>.<lambda> at 0x7fd80c97a830>),call(<function init_schema.<locals>.<lambda> at 0x7fd80c97a9e0>,<function init_schema.<locals>.<lambda> at 0x7fd80c97a950>),call(<function init_schema.<locals>.<lambda> at 0x7fd80c97ab00>,<function init_schema.<locals>.<lambda> at 0x7fd80c97aa70>),call().__next__(),call().__next__().__str__()]

我该如何前往每个通话并检查lambda的参数?

解决方法

您可以使用call_args_list来获取带有args的所有呼叫。

....execute_lambda.call_args_list

示例

>>> mock = Mock(return_value=None)
>>> mock()
>>> mock(3,4)
>>> mock(key='fish',next='w00t!')
>>> mock.call_args_list
[call(),call(3,4),call(key='fish',next='w00t!')]
>>> expected = [(),((3,),({'key': 'fish','next': 'w00t!'},)]
>>> mock.call_args_list == expected

真实 ref-https://docs.python.org/3/library/unittest.mock.html#unittest.mock.Mock.call_args_list