python unittest: 无法调用修饰的测试

7 投票
4 回答
3252 浏览
提问于 2025-04-16 19:21

我有一个比较大的测试套件,我给一些以test_开头的函数加了装饰器。现在我不能通过 ./test.py MySqlTestCase.test_foo_double 来调用它们了,python3.2 报错说:ValueError: no such test method in <class '__main__.MySqlTestCase'>: result。我的装饰器代码是这样的:

def procedure_test(procedure_name, arguments_count, returns):

    '''Decorator for procedure tests, that simplifies testing whether procedure
    with given name is available, whether it has given number of arguments
    and returns given value.'''

    def decorator(test):
        def result(self):
            procedure = self.db.procedures[self.case(procedure_name)]
            self.assertEqual(len(procedure.arguments), arguments_count)
            self.assertEqual(procedure.returns, 
                             None if returns is None else self.case(returns))
            test(self, procedure)
        return result
    return decorator

还有这个测试方法:

@procedure_test('foo_double', 0, 'integer')
def test_foo_double(self, procedure):
    self.assertEqual(procedure.database, self.db)
    self.assertEqual(procedure.sql, 'RETURN 2 * value')
    self.assertArguments(procedure, [('value', 'int4')])

4 个回答

1

这对我有帮助:

from functools import wraps

...

@wraps(procedure_name)
def decorator(test):
2

这是一个解决这个问题的简单方法。

from functools import wraps

def your_decorator(func):
    @wraps(func)
    def wrapper(self):
        #Do Whatever
        return func(self)
    return wrapper

class YourTest(APITestCase):
    @your_decorator
    def example(self):
        #Do your thing
7

我觉得问题出在被装饰的函数名字不一样,而且它也不符合被认为是测试方法的标准。

使用 functools.wrap 来装饰 decorator 应该能解决你的问题。更多信息可以在 这里 找到。

撰写回答