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

Python Unittest Mock失效:集成测试无法Mock Helper函数

问题:集成测试中Mock函数未生效,原函数仍执行

项目结构

my_project 
├── __init__.py
├── app.py
├── helpers
│   └── __init__.py
└── tests
    ├── __init__.py
    ├── integration
    │   ├── __init__.py
    │   └── test_app.py
    └── unit
        ├── __init__.py
        └── test_helpers.py

helpers模块的单元测试Mock正常,但tests/integration/test_app.py的集成测试中,Mock未按预期工作,原函数仍在执行。

相关代码片段

  1. helpers/__init__.py中的函数:
def compute_completeness_metric(
        vendor,
        product,
        fields,
        endpoint):
    body = {"vendor": vendor, "product": product, "fields": fields}
    response_json = requests.post(
        "http://example.com", json=body)
    if response_json.status_code != 200:
        response_json = "Can't compute"
    else:
        response_json = response_json.json()
    return response_json
  1. app.py中的调用方式:
from helpers import compute_completeness_metric
def main(req: func.HttpRequest) -> func.HttpResponse:
    final_results = {}
    final_results = compute_completeness_metric(vendor, product, fields, endpoint)
    # ... 其余逻辑
  1. 测试中使用的Mock代码:
@patch('data_quality.helpers.compute_completeness_metric')
def test_app(self, mock_compute_completeness_metric):
    mock_compute_completeness_metric.return_value = "blablabla"

解决方案

核心问题是Mock的目标路径错误。Python Mock的生效逻辑是替换被测试模块中实际引用的对象,而非原模块中的对象。

因为app.py通过from helpers import compute_completeness_metric将函数直接导入到了app模块的命名空间中,此时app模块使用的是自己命名空间里的compute_completeness_metric引用,而非原helpers模块的引用。

修改测试代码中的patch路径即可解决:

@patch('app.compute_completeness_metric')
def test_app(self, mock_compute_completeness_metric):
    mock_compute_completeness_metric.return_value = "blablabla"
    # 执行测试逻辑并断言

补充说明

  • 单元测试helpers模块时,因为测试的是模块本身,直接Mockhelpers.compute_completeness_metric是正确的。
  • 集成测试针对app模块时,必须Mockapp模块内导入的那个函数引用,否则原函数会继续执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 12:35:24