тестирование Python: не может вызвать оформленный тест - PullRequest
6 голосов
/ 11 июня 2011

У меня довольно большой набор тестов, и я украсил некоторые функции 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 ]

7 голосов
/ 17 ноября 2011

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

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

1 голос
/ 02 сентября 2016

На основании этой записи:

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

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

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

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

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

0 голосов
/ 19 декабря 2012

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

from functools import wraps

...

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