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')]) 

3 Solutions collect form web for “python unittest: не может называть декорированный тест”

Я думаю, проблема заключается в том, что украшенная функция не имеет одного и того же имени и, кроме того, не удовлетворяет шаблону, который считается тестовым методом.

Использование functools.wrap для украшения decorator должно решить вашу проблему. Дополнительная информация здесь .

Это поможет мне:

 from functools import wraps 

 @wraps(procedure_name) def decorator(test): 

Основываясь на этом сообщении:

Вы можете сделать это следующим образом:

 def decorator(test): def wrapper(self): # do something interesting test(self) # do something interesting wrapper.__name__ = test.__name__ return wrapper 

Это решение имеет два преимущества по сравнению с методом @functools.wrap :

  • ничего не нужно импортировать
  • не требуется знать имя теста при создании декоратора

Благодаря второй возможности этого решения можно создать декораторы для многих тестов.

  • Определение декораторов Python для полного модуля
  • как передать динамические данные декораторам
  • Python - получить исходные аргументы функции в декораторе
  • Python: Как получить доступ к экземпляру украшенного класса внутри декоратора класса?
  • Почему нужна строка в этой функции python? (памятная рекурсия)
  • Декоратор Python с флягой
  • Как пропустить или игнорировать декораторы python
  • Декодер Python @property не работает
  • Python - лучший язык программирования в мире.