Python单元测试中装饰器未执行问题求助
问题原因及解决方法
问题出在装饰器返回的内层函数没有保留原测试方法的元数据,导致unittest框架无法识别它是一个测试方法,根本没执行这个装饰后的方法,自然不会抛出异常,测试就直接通过了。
unittest是通过方法名以test_开头来识别测试方法的,但你写的装饰器返回的wrapped函数默认会把自己的名称设为wrapped,覆盖了原方法的test_01_client_init名称,框架扫描时会忽略这个方法,相当于这个测试根本没运行。
解决办法
用functools.wraps装饰内层的wrapped函数,它会把原函数的名称、文档字符串等元数据复制到内层函数上,让unittest能正确识别出这是一个测试方法。
修改后的代码示例:
import functools import unittest def work_please(func): @functools.wraps(func) # 关键:保留原函数元数据 def wrapped(*args, **kwargs): raise Exception('in work please decorator') return wrapped class YourTestCase(unittest.TestCase): @work_please def test_01_client_init(self): self._mock_start_server.assert_called()
运行修改后的代码,装饰器的内层逻辑就会被执行,抛出异常导致测试失败,符合预期。
如果是带参数的装饰器,同样要在最内层的执行函数上加上@functools.wraps(func),确保元数据不丢失。
内容的提问来源于stack exchange,提问作者dsollen
相关产品推荐
相关产品推荐

