Python联合-在另一个decorator中收集多个@patch decorator

Python联合-在另一个decorator中收集多个@patch decorator,python,unit-testing,python-2.7,mocking,python-decorators,Python,Unit Testing,Python 2.7,Mocking,Python Decorators,我正在编写一个内部单元测试框架,其中包括模拟多个函数/类。 @补丁似乎很适合我的需要,但由于有许多测试需要修补许多不同的类/函数,我希望避免在每次测试之前编写多个@patch,并可能将它们封装到另一个decorator中。 为了更好地说明我的需要: 当前状态: @patch('p.A', mockedA) @patch('p.B', mockedB) . . @patch('p.N', mockedN) def test_this() 所需状态: @patch_all def test_thi

我正在编写一个内部单元测试框架,其中包括模拟多个函数/类。
@补丁似乎很适合我的需要,但由于有许多测试需要修补许多不同的类/函数,我希望避免在每次测试之前编写多个@patch,并可能将它们封装到另一个decorator中。 为了更好地说明我的需要:

当前状态:

@patch('p.A', mockedA)
@patch('p.B', mockedB)
.
.
@patch('p.N', mockedN)
def test_this()
所需状态:

@patch_all
def test_this()
有可能实现这样的功能吗?到目前为止,我无法按照@patch的要求执行def或其他@。

编辑2:
我试过米歇尔的建议,但这个测试不再被视为测试:
在将functools.wrapps添加到修补程序\u all decorator后,它成功了

def patch_all(f):
@patch('p.A', moduleA.classA.methodA)
@patch('p.B', moduleB.classB.methodB)
.
.
@patch('p.N', moduleN.classN.methodN)
wraps(f)
def functor(*args, **kwargs):
    return f(*args, **kwargs)
return functor


class TestWrapper(unittest.TestCase):
    @patch_all
    def my_test(self):
        my test goes here...
使用@patch\u all decorator,我得到的是:

nosetests Tester.py --nocapture 

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK
如果我删除它:

$ nosetests Tester.py --nocapture 
.
----------------------------------------------------------------------
Ran 1 test in 7.692s

OK

提前感谢。

patch
decorator和所有decorator一样,只是一个接受函数并返回函数的函数([EDIT]在原始版本中,我忘记了
@functools.wrapps(f)
来生成正确的测试decorator,感谢@MenyIssakov让我知道我的答案是错误的)。您可以定义自己的
patch\u all
decorator

def patch_all(f):
    @patch('p.A', argsA)
    @patch('p.B', argsB)
    .
    .
    @patch('p.N', argsN)
    @functools.wraps(f)
    def functor(*args, **kwargs):
        return f(*args, **kwargs)
    return functor
现在,您可以在测试中使用
@patch\u all
装饰器,如:

@patch_all
def test_all(mockN, ..., mockB, mockA):
    my beautiful test
您可以检查一下这一点,然后定义自己的decorator,将元组列表传递给补丁调用


然而,我认为这不是一个好主意:测试应该简单,模拟应该明确,以明确测试的目的。如果您必须在很多测试中修补很多对象/方法/函数,那么函数就应该考虑,而不是单一的方法来编写所有测试方法的一次。p> 嗨,米歇尔,我试过你的例子,我以前也做过类似的事情。使用此方法后,我的问题是测试不再被标识为单元测试(我使用的是nose)。一旦我删除patch_-all注释并运行nosetests tests.py,它就会尝试运行我的测试,如果我放回patch_-all注释,我会收到一条消息,它运行了0个测试。您的测试名称必须以bu
test\uuu
开头,否则运行程序也无法识别它。不过,我相信如果这是必须的,当我移除装饰器时,它就不会运行了。好吧,这取决于运行者。我需要一些时间来看看。也许可以使用
@wrap
装饰程序来修复它。但我现在不能试,我在用电话。今天晚些时候我可以试试。你说得对!我添加了functools.wrapps,但它不起作用。我将稍后修复我的答案