Как протестировать декораторы функций Python?
Я пытаюсь написать модульные тесты, чтобы обеспечить правильность различных декораторов, которые я написал. Вот начало кода, который я пытаюсь написать:
import unittest
from memoizer import Memoizer
from strategies.mru import MRU
@Memoizer(strategy=MRU(maxsize=10))
def fib(x):
if x < 2:
return 1
else:
return fib(x-1) + fib(x-2)
class TestMemoizer(unittest.TestCase):
def test_simple(self):
self.assertEqual(fib(0), 1)
self.assertEqual(fib(1), 1)
self.assertEqual(fib(10), 89)
if __name__ == '__main__':
unittest.main()
хотя это работает прилично для стратегии MRU, которую я имею выше, я планирую написать дополнительные стратегии, в этом случае мне нужно будет украсить функцией fib по-разному. (Напомним, что, поскольку fib вызывает fib, установка fib2 = memoize (fib) не запоминает промежуточные значения, поэтому это не будет работать.) Что такое правильный способ проверить других декораторов?
2 ответов
взгляните на тесты в стандартной библиотеке для примеров:http://hg.python.org/cpython/file/3.2/Lib/test/test_functools.py#l553
обычно я добавляю некоторые инструменты к обернутой функции, чтобы я мог отслеживать вызовы.
вместо того, чтобы запоминать тестовую функцию на уровне модуля, я создаю memoized функцию внутри тест, так что новый создается для каждого теста и для каждого варианта декоратора.
Как насчет довольно сложной
def mkfib(strategy):
@Memoizer(strategy=strategy)
def fib(x):
if x < 2:
return 1
else:
return fib(x-1) + fib(x-2)
return fib
таким образом, вы могли бы сделать
fib1 = mkfib(MRU(maxsize=10))
self.assertEqual(fib1(0), 1)
self.assertEqual(fib1(1), 1)
fib2 = mkfib(MRU(maxsize=10)) # produces another cache
self.assertEqual(fib2(0), 1)
self.assertEqual(fib2(1), 1)