如何测试Python函数装饰器?
我试图编写单元测试,以确保我编写的各种装饰程序的正确性。以下是我试图编写的代码的开头:如何测试Python函数装饰器?,python,unit-testing,decorator,Python,Unit Testing,Decorator,我试图编写单元测试,以确保我编写的各种装饰程序的正确性。以下是我试图编写的代码的开头: 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 Tes
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()
导入单元测试
从回忆录导入回忆录
从strategies.mru导入mru
@记忆器(策略=MRU(最大值=10))
def纤维(x):
如果x<2:
返回1
其他:
返回fib(x-1)+fib(x-2)
类TestMemorizer(unittest.TestCase):
def测试_简单(自):
self.assertEqual(fib(0),1)
自我评估资格(fib(1),1)
自我评估资格(fib(10),89)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
unittest.main()
虽然这对我上面提到的MRU策略很有效,但我计划编写额外的策略,在这种情况下,我需要以不同的方式装饰fib函数。(回想一下,因为fib调用fib,所以设置fib2=memoize(fib)不会对中间值进行memoize,这样就不起作用了。)测试其他装饰器的正确方法是什么?比较复杂的
def mkfib(strategy):
@Memoizer(strategy=strategy)
def fib(x):
if x < 2:
return 1
else:
return fib(x-1) + fib(x-2)
return fib
查看标准库中的测试以获取示例: 我通常会在被包装的函数中添加一些插装,以便监视调用
我没有在模块级记忆测试函数,而是在测试内部创建记忆函数,以便为每个测试和每个装饰变量创建一个新函数。Ah,对。我不知道为什么我没有想到不用斐波那契数。我很想看看你的MRU代码。希望你能发布一个链接。当然!我的回忆录的代码如下:编辑:我认为我的mru.py实际上应该称为lru.py
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)