Python单元测试:理解装饰器问题

Python单元测试:理解装饰器问题,python,unit-testing,decorator,Python,Unit Testing,Decorator,最近几天,我在python中测试了一些自动化单元测试的技术,比如C#中的TestCase 我知道有些框架支持这种技术,但我将更详细地学习python,因此我想了解这一点 对我来说,下面的帖子有一个很好的答案(来自Xavier Decoret),所以我尝试了一下,结果非常好,但我不能毫无例外地堆叠装饰器 简而言之,我的两段代码,结果异常和环境: import sys def for_examples(*parameters): def tuplify(x): if not isi

最近几天,我在python中测试了一些自动化单元测试的技术,比如C#中的TestCase

我知道有些框架支持这种技术,但我将更详细地学习python,因此我想了解这一点

对我来说,下面的帖子有一个很好的答案(来自Xavier Decoret),所以我尝试了一下,结果非常好,但我不能毫无例外地堆叠装饰器

简而言之,我的两段代码,结果异常和环境:

import sys

def for_examples(*parameters):

  def tuplify(x):
    if not isinstance(x, tuple):
      return (x,)
    return x

  def decorator(method, parameters=parameters):
    for parameter in (tuplify(x) for x in parameters):

      def method_for_parameter(self, method=method, parameter=parameter):
        method(self, *parameter)
      args_for_parameter = ",".join(repr(v) for v in parameter)
      name_for_parameter = method.__name__ + "(" + args_for_parameter + ")"
      frame = sys._getframe(1)  # pylint: disable-msg=W0212
      frame.f_locals[name_for_parameter] = method_for_parameter
    return None
  return decorator

希望有人能帮助我理解我的问题,我们可以找到一个可堆叠的解决方案。

你复制的装饰器不是设计用来这样使用的

原因是这一行:

return None
通常,装饰程序应该返回装饰过的函数,而不是
None
。然而,在这种情况下,装饰器故意不返回一个函数,因此UNITTEST不认为它是一个测试用例。 好在这根本不是问题,因为

@for_examples(1, 2)
@for_examples(3, 4)
相当于

@for_examples(1, 2, 3, 4)

你复制的装饰器不是设计成那样使用的

原因是这一行:

return None
通常,装饰程序应该返回装饰过的函数,而不是
None
。然而,在这种情况下,装饰器故意不返回一个函数,因此UNITTEST不认为它是一个测试用例。 好在这根本不是问题,因为

@for_examples(1, 2)
@for_examples(3, 4)
相当于

@for_examples(1, 2, 3, 4)

是的,我只使用了一个装饰器进行了测试,但就我的理解而言,我知道为什么使用两个装饰器是不可能的。必须更改运行两次的内容。我已经测试了返回类型的一些变体,但没有得到令人满意的结果。当我使用参数的
method\u作为返回类型时,不会从测试框架执行任何操作。@rené“正确”的返回值应该是
method
。但是你会有一个额外的测试用例,它总是会失败,因为它没有收到任何参数。是的,我只使用了一个decorator对它进行了测试,但是根据我的理解,我知道为什么使用两个decorator是不可能的。必须更改运行两次的内容。我已经测试了返回类型的一些变体,但没有得到令人满意的结果。当我使用参数
method\u作为返回类型时,不会从测试框架执行任何操作。@rené“正确”的返回值应该是
method
。但是,您将有一个额外的测试用例,它总是会失败,因为它没有收到任何参数。