2016-03-02 47 views
1

我有以下装饰应该包装在try/except块中的测试用例函数的实现和打印日志如果发生异常。装饰器在鼻子测试案例,产生

def print_log(test_case): 
    @wraps(test_case) 
    def run_test(self): 
     try: 
      test_case(self) 
     except: 
      Test_Loop.failure_teardown(self) 
      raise 
    return run_test 

然而,这似乎并没有对我的测试情形之一的工作,调用产量发电机

请多多包涵,因为这是一个基本的例子:

class Test_Loop: 
    # ton of implementation here (e.g. initialization, etc) 

    def runIt(self, name, ip, port): 
     # code here 

    @print_log 
    def test_log_looper(self): 
     for l in self.links: 
      # initialize variables seen below and other stuff 
      for n in names: 
       # do stuff 
       for i in ips: 
        # do stuff 
        for p in ports: 
         yield self.runIt, l, n, i, p 

从调试,当应用装饰器时,它似乎甚至不会进入第一个循环。我究竟做错了什么?

+0

1.你从来没有真正返回从包装调用'test_case'的结果。 2.你实际上并不使用封装器中的发生器。 – jonrsharpe

+1

从'print_log'调用'test_case'只返回生成器;你并没有重复它。 – chepner

回答

1

你需要迭代你的发生器。像这样修改你的修饰器:

def print_log(test_case): 
    @wraps(test_case) 
    def run_test(self): 
     try: 
      for _ in test_case(self): pass 
     except: 
      Test_Loop.failure_teardown(self) 
      raise 
    return run_test 
+0

谢谢。我最终将for循环移出try块并在内部调用'yield _',因为我希望每个迭代都被包装,但现在它不会识别何时会发生异常。 – ILostMySpoon

+0

您确定需要移动它在尝试之外?如果你保留在那里,每一次迭代都会被包装进你的try语句中。 – DevShark

+0

是的,我希望生成器的每一次迭代都包含在try中,以便如果任何一个抛出异常,日志将被打印。但是,我无法相应地获得这项工作。 – ILostMySpoon