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未按预期工作,原函数仍在执行。
相关代码片段
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
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) # ... 其余逻辑
- 测试中使用的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
相关产品推荐
相关产品推荐

