【发布时间】:2015-10-29 18:09:42
【问题描述】:
我正在尝试模拟一个测试函数,该测试最终通过inspect.getargspec 函数传递模拟。我想使用一些特定的名称作为模拟函数的参数名称。
据我所知,没有具体的方法来模拟参数名称,所以我尝试使用 Mock 的 spec= 参数:
In [1]: import mock, inspect
In [2]: inspect.getargspec(mock.Mock(spec=lambda a,b:None))
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-2-de358c5a968d> in <module>()
----> 1 inspect.getargspec(mock.Mock(spec=lambda a,b:None))
/usr/lib/python2.7/inspect.pyc in getargspec(func)
815 if not isfunction(func):
816 raise TypeError('{!r} is not a Python function'.format(func))
--> 817 args, varargs, varkw = getargs(func.func_code)
818 return ArgSpec(args, varargs, varkw, func.func_defaults)
819
/usr/lib/python2.7/inspect.pyc in getargs(co)
750
751 if not iscode(co):
--> 752 raise TypeError('{!r} is not a code object'.format(co))
753
754 nargs = co.co_argcount
TypeError: <Mock name='mock.func_code' id='140395908951120'> is not a code object
所以,是的,确实,Mock 不是代码对象。如何模拟参数名称以便 inspect.getargspec 返回这些名称?
【问题讨论】:
-
Mock对象的一点是,创建它通常比编写适当的模拟类或模拟函数更容易。如果Mock类不能为您简化事情,只需编写一个模拟函数即可。 (我知道你不会免费获得函数调用跟踪功能,但也许你甚至不需要它。) -
@SvenMarnach:是的,实际上我想使用 Mock 因为呼叫跟踪。但也许你是对的……
-
你可以在你的模拟函数中调用一个模拟来进行跟踪。 :)
-
@SvenMarnach:你能把这两个都放在一个答案中,这样我就可以正确地给你投票了吗?
-
我已经在正确的答案中详细阐述了 cmets。
标签: python python-2.7 inspect python-mock