Python继承类super()初始化语句测试覆盖率未覆盖如何解决
解决方案
你遇到的未覆盖问题大概率是直接实例化A时,父类B的构造方法触发了额外依赖逻辑导致报错、提前终止执行,或是之前的patch路径不符合规则没有生效。你可以按照以下步骤修复:
- 遵循patch的定位规则:需要patch
A类定义所在模块中引用的B的__init__方法,而非全局的B类本身,符合「在哪里使用就在哪里patch」的原则。 - 将父类构造方法mock为空实现:避免父类逻辑执行时抛出异常,保证
A的__init__中super调用行可以正常执行完成。
示例测试代码
"""Test class for A""" from datetime import timedelta, datetime from mock import patch, MagicMock from unittest import TestCase # 假设A类定义在my_task模块中,替换为你实际的模块路径 from my_task import A class JobInfoHandler: """Mock job info.""" def __init__(self): self.crawlerConfig = None class TestA(TestCase): """Test class for A.""" # 替换为A类所在模块中B的引用路径 @patch('my_task.B.__init__', return_value=None) def test_a_init_super_call(self, mock_b_init): job_info_ob = JobInfoHandler() input_kwargs = { 'owner': 'arahej', 'task_id': '12', 'schedule_interval': timedelta(minutes=60), 'job_info': job_info_ob } # 实例化A时super行正常执行 self.obj_a = A(**input_kwargs) # 可选:验证super调用的参数是否符合预期 mock_b_init.assert_called_once_with( execution_timeout=timedelta(minutes=30), **input_kwargs )
运行上述测试用例后,super(A, self).__init__(...)这行代码就会被正常统计到覆盖率中。
内容的提问来源于stack exchange,提问作者Aman Raheja
相关产品推荐
相关产品推荐

