Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何测试Python函数装饰器?_Python_Unit Testing_Decorator - Fatal编程技术网

如何测试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)