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匹配器时,会自动调用匹配规则做校验,不需要额外适配:
- 先安装依赖:
pip install PyHamcrest - 测试代码中直接导入使用即可:
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
相关产品推荐
相关产品推荐

