如何通过Mock测试Python中SomeClass类的regions方法?
基于Mock的SomeClass.regions方法单元测试实现
你当前的测试代码存在问题:直接修改类属性并调用类方法,但regions是实例方法,必须针对实例进行测试。以下是两种无需创建真实文件、无需调用load方法的Mock测试方案:
方案1:直接Mock实例(推荐)
通过unittest.mock.Mock创建符合SomeClass规格的实例,直接指定测试用的data_dict,验证regions方法的返回值:
import unittest from unittest.mock import Mock import prog class TestSomeClass(unittest.TestCase): def test_regions(self): # 创建SomeClass的Mock实例,保证方法签名符合原类 mock_someclass = Mock(spec=prog.SomeClass) # 设置实例的data_dict为测试数据 mock_someclass.data_dict = {"华东": {"0-14岁": 1200}, "华北": {"15-64岁": 2500}} # 调用实例的regions方法 actual_regions = mock_someclass.regions() # 断言返回结果与预期一致 self.assertEqual(actual_regions, ["华东", "华北"])
方案2:用patch替换实例属性
通过patch.object临时替换SomeClass的data_dict属性,创建实例时会自动使用Mock值:
import unittest from unittest.mock import patch import prog class TestSomeClass(unittest.TestCase): def test_regions(self): # 临时替换SomeClass的data_dict属性 with patch.object(prog.SomeClass, "data_dict", new={"西部": {}, "东北": {}}): # 创建实例(无需真实文件名,因为不会调用load) test_instance = prog.SomeClass("无需真实文件.txt") # 调用regions方法 actual_regions = test_instance.regions() # 断言结果符合预期 self.assertEqual(actual_regions, ["西部", "东北"])
说明
两种方案都完全规避了文件IO和load方法的依赖,专注测试regions方法本身的逻辑——即返回data_dict的键列表。
内容的提问来源于stack exchange,提问作者andsemenov
相关产品推荐
相关产品推荐

