如何Patch父类中导入的模块?Python测试问题求助
解决mock load_json时出现“does not have attribute 'load_json'”的问题
报错原因
你当前patch的是子类模块(path.to.child)中的load_json,但load_json是在父类所在的模块里导入并被func_1调用的,子类模块并没有这个属性,所以会触发“does not have attribute 'load_json'”错误。
正确解决方法
方法1:patch父类模块中的load_json
因为父类的func_1实际调用的是其自身模块内的load_json引用,所以需要patch父类所在模块的load_json。假设父类位于myapp.parent_module,测试代码修改如下:
from unittest.mock import patch from path.to.child import Child @patch("myapp.parent_module.load_json", return_value={"my":"file contents"}) def test_func_2(mock_load_json): c = Child() # 根据func_1和func_2的逻辑设置预期值 expected = {"my":"file contents", "additional data": "some new data"} assert c.func_2() == expected
方法2:直接mock父类的func_1方法
如果只想测试子类func_2的自身逻辑,也可以跳过load_json,直接mock父类的func_1方法,避免依赖文件加载逻辑:
from unittest.mock import patch from path.to.child import Child @patch.object(Child, "func_1", return_value={"my":"mock data", "additional data": "some new data"}) def test_func_2(mock_func_1): c = Child() # 根据func_2的实际处理逻辑设置预期结果 assert c.func_2() == {"my":"mock data", "additional data": "some new data"}
内容的提问来源于stack exchange,提问作者Conor
相关产品推荐
相关产品推荐

