You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python单元测试如何断言mock函数调用入参包含指定子字符串

问题解决方法

无需第三方依赖的原生实现

unittest.mock 的参数匹配逻辑本质是判断「传入实际参数」和「断言里写的预期值」是否相等,你可以通过两种方式实现路径包含校验:

  • 直接遍历mock的调用记录手动校验,适合不想写额外工具类的场景:
@patch('module.os.remove')
def test_clear_directory(delete_function, directory):
    clear_directory(directory)
    assert delete_function.called, "os.remove未被调用"
    # 遍历所有os.remove的调用入参
    for call_args in delete_function.call_args_list:
        removed_path = call_args.args[0]
        assert directory in removed_path, f"删除路径{removed_path}未包含目标目录{directory}"
  • 自定义可复用的CONTAINS匹配器,实现和你预期完全一致的断言写法:
class CONTAINS:
    def __init__(self, expected_substr: str):
        self.expected_substr = expected_substr
    def __eq__(self, actual_value: str) -> bool:
        return isinstance(actual_value, str) and self.expected_substr in actual_value

# 断言时直接使用
delete_function.assert_called_with(CONTAINS(directory))

使用PyHamcrest匹配器

PyHamcrest 提供的contains_string匹配器原生兼容unittest.mock的断言逻辑,mock识别到传入的是Hamcrest匹配器时,会自动调用匹配规则做校验,不需要额外适配:

  1. 先安装依赖:
    pip install PyHamcrest
  2. 测试代码中直接导入使用即可:
from hamcrest import contains_string

# 替换你之前的ANY即可
delete_function.assert_called_with(contains_string(directory))

额外提示:你当前的clear_directory函数存在逻辑缺陷:os.listdir会同时返回目录下的文件和子文件夹,而os.remove只能删除文件,遇到子文件夹时会抛出OSError导致清空失败,生产环境使用建议补充文件类型判断,子文件夹需要用shutil.rmtree删除。

内容的提问来源于stack exchange,提问作者Grant Moore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 22:42:18