Python unittest: не может называть декорированный тест
У меня есть довольно большой набор тестов, и я украсил некоторые из функций 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')])
Ответы
Ответ 1
Я думаю, проблема в том, что украшенная функция не имеет одного и того же имени, а также не удовлетворяет шаблону, который считается тестовым методом.
Использование functools.wrap
для украшения decorator
должно устранить вашу проблему. Дополнительная информация здесь.
Ответ 2
Это поможет мне:
from functools import wraps
...
@wraps(procedure_name)
def decorator(test):
Ответ 3
Основываясь на этом сообщении:
Вы можете сделать это следующим образом:
def decorator(test):
def wrapper(self):
# do something interesting
test(self)
# do something interesting
wrapper.__name__ = test.__name__
return wrapper
Это решение имеет два преимущества по сравнению с методом @functools.wrap
:
- не нужно ничего импортировать
- не нужно знать имя теста при создании декоратора.
Благодаря второй функции этого решения можно создать декораторы для многих тестов.