如何测试返回外部信息的代码?以getPrimaryMonitorSize函数为例
解决思路:抽象依赖 + 模拟(mock)测试
第一步:把系统交互逻辑抽成独立层
别让getPrimaryMonitorSize()直接调用OS API,而是把这部分逻辑拆成一个单独的接口/类,比如叫DisplayAdapter。生产环境用真实的系统调用实现,测试时用模拟的实现。
举个伪代码例子:
# 定义抽象接口 class DisplayAdapter: def get_primary_resolution(self): pass # 生产环境的真实实现 class SystemDisplayAdapter(DisplayAdapter): def get_primary_resolution(self): # 这里写调用系统API的代码,比如Windows用ctypes、Linux用Xlib # 实际返回系统真实的分辨率 return (1920, 1080) # 你的工具模块 class DisplayTool: def __init__(self, adapter: DisplayAdapter = None): # 依赖注入,默认用系统实现 self.adapter = adapter or SystemDisplayAdapter() def getPrimaryMonitorSize(self): return self.adapter.get_primary_resolution()
第二步:用模拟对象写测试
测试时不用碰真实的系统API,直接造一个模拟的DisplayAdapter,预设好返回值,然后验证getPrimaryMonitorSize()能不能正确拿到这个值。
比如用Python的unittest.mock:
from unittest.mock import Mock def test_get_primary_monitor_size(): # 造一个模拟适配器,指定返回值 mock_adapter = Mock(spec=DisplayAdapter) mock_adapter.get_primary_resolution.return_value = (2560, 1440) # 把模拟适配器传给工具类 tool = DisplayTool(mock_adapter) # 验证结果是否符合预期 assert tool.getPrimaryMonitorSize() == (2560, 1440) # 还能检查适配器方法有没有被正确调用 mock_adapter.get_primary_resolution.assert_called_once()
为什么这个方案靠谱?
- 摆脱系统依赖:测试不管在什么机器上跑,模拟的返回值都是固定的,不会因为换了显示器就失败。
- 没有代码冗余:测试不用重复写系统API调用的逻辑,只需要验证你的工具函数是否正确转发/处理数据(如果以后加了分辨率转换之类的逻辑,这个优势更明显)。
- 贴合TDD思路:你可以先写测试,先定义
DisplayAdapter的接口,再实现工具类,最后补全真实的系统适配代码。
内容的提问来源于stack exchange,提问作者wigi426
相关产品推荐
相关产品推荐

