Python 如何使用插入参数的装饰器自动指定模拟函数?

Python 如何使用插入参数的装饰器自动指定模拟函数?,python,unit-testing,mocking,Python,Unit Testing,Mocking,这是我设置的玩具版本: import mock import functools def quux(f): @functools.wraps(f) def wrapper(self, *args, **kwargs): return f(self, 'spam', *args, **kwargs) return wrapper class Foo: @quux def bar(self, baz): pass moc

这是我设置的玩具版本:

import mock
import functools

def quux(f):
    @functools.wraps(f)
    def wrapper(self, *args, **kwargs):
        return f(self, 'spam', *args, **kwargs)
    return wrapper

class Foo:
    @quux
    def bar(self, baz):
        pass


mock_foo = mock.create_autospec(Foo())
mock_foo.bar()
这在python 2中有效,但在python 3中失败,原因是:

Traceback (most recent call last):
  File "thing.py", line 17, in <module>
    mock_foo.bar()
  File "./venv/lib/python3.6/site-packages/mock/mock.py", line 1061, in __call__
    _mock_self._mock_check_sig(*args, **kwargs)
  File "./venv/lib/python3.6/site-packages/mock/mock.py", line 209, in checksig
    sig.bind(*args, **kwargs)
  File "/usr/lib/python3.6/inspect.py", line 2934, in bind
    return args[0]._bind(args[1:], kwargs)
  File "/usr/lib/python3.6/inspect.py", line 2849, in _bind
    raise TypeError(msg) from None
TypeError: missing a required argument: 'baz'
回溯(最近一次呼叫最后一次):
文件“thing.py”,第17行,在
mock_foo.bar()
文件“/venv/lib/python3.6/site packages/mock/mock.py”,第1061行,在调用中__
_模拟自我。模拟检查信号(*args,**kwargs)
文件“/venv/lib/python3.6/site packages/mock/mock.py”,第209行,在checksig中
符号绑定(*args,**kwargs)
文件“/usr/lib/python3.6/inspect.py”,第2934行,在bind中
返回args[0]。\u绑定(args[1:],kwargs)
文件“/usr/lib/python3.6/inspect.py”,第2849行,在绑定中
从“无”引发类型错误(msg)
TypeError:缺少必需的参数:“baz”
最初,我尝试使用并编辑签名来删除baz参数,因为在我的实际设置中,值始终作为方法之前的第一个参数注入

我希望能够保持自动检查我的模拟,以确保在测试期间正确调用函数。然而,由于我想在某个时候在Python3上运行,所以这种设置是不可行的


旁注:我遇到的一个障碍是有时需要包装可调用对象而不是函数,因此我的理想解决方案也适用于这些对象。

欢迎使用StackOverflow!这是一个好问题。你读过吗?它看起来像一个开放的Python bug。