Python中含硬编码字典的类做单元测试是否需要使用mock?
核心问题解答
- 能不能直接基于现有硬编码字典写测试?
可以,而且非常推荐。你这个类的核心功能就是基于内置的位置映射做查询,直接用真实字典值写测试,既可以验证get_user_team_id的查询、抛异常逻辑正常,还能同步校验硬编码的映射值符合预期,相当于一举两得。 - 需要考虑字典后续变更的影响吗?
你已经明确后续只会新增键值对、不会修改已有值,只要你的测试仅覆盖当前已经确定不会改动的固定映射,就不会出现后续变更导致测试失效的问题。如果后续有人误改了已有值,测试失败反而是预期的防护效果,能提前拦截不符合要求的改动。 - 需要用mock吗?
完全不需要。mock的适用场景是隔离测试逻辑以外的外部依赖(比如第三方接口、数据库操作等),你这个类里的字典属于自身业务逻辑的一部分,是测试要验证的对象之一,mock反而会跳过对真实映射关系的校验,让测试失去意义。 - 怎么覆盖类的实例化逻辑?
你当前测试里每次都新建TeamLocation实例的写法已经覆盖了__init__执行逻辑,如果需要显式校验初始化后的字典符合预期,可以额外加一个单测:
def test_team_location_initialization(): team_location = TeamLocation() # 校验预期的位置存在 assert set(team_location._types_location.keys()) >= {"New York", "LA"} # 校验字典值结构符合要求 for location_info in team_location._types_location.values(): assert "team_id" in location_info assert isinstance(location_info["team_id"], int)
现有测试的Bug修复
你当前的异常测试存在类型不匹配问题:类方法中抛出的是自定义异常CityNotSupportedException,但测试里捕获的是ValueError,会导致测试失败,修正后的代码如下:
def test_team_location_not_ok(): team_location = TeamLocation() with pytest.raises(CityNotSupportedException) as excinfo: team_location.get_user_team_id('Boston') assert "Location: Boston does not exist." in str(excinfo.value)
内容的提问来源于stack exchange,提问作者mp252
相关产品推荐
相关产品推荐

