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

如何使用AioHTTPTestCase与@patch覆盖异步函数内的变量值?

解决方法

首先明确:函数内部的局部变量无法直接被unittest.mock.patch覆盖,因为patch只能作用于模块、类或对象级别的可访问属性。所以需要先调整原函数结构,把要替换的变量a改为模块级变量,这样才能被patch定位到。

1. 改造原模块代码

修改my_module.py,将局部变量a的定义改为引用模块级变量:

# my_module.py
# 把原来的局部a改成模块级变量
A_VALUE = 10

async def foo():
    a = A_VALUE  # 引用模块级变量
    b = 10
    return a + b

2. 编写测试用例

使用AioHTTPTestCase结合@patch装饰器,直接patch模块级的A_VALUE:

import unittest
from unittest.mock import patch
from aiohttp.test_utils import AioHTTPTestCase
from my_module import foo

class TestFooFunction(AioHTTPTestCase):
    async def get_application(self):
        # 初始化测试用的aiohttp应用,可根据实际需求调整
        from aiohttp import web
        return web.Application()

    @patch('my_module.A_VALUE', return_value=5)
    async def test_patched_foo(self, _mock_a):
        # 执行异步函数并验证结果
        result = await foo()
        self.assertEqual(result, 15)  # 5 + 10 = 15

关键说明

  • @patch('my_module.A_VALUE', return_value=5)会在测试函数执行期间,临时把my_module里的A_VALUE替换为5,函数foo引用该变量时就会使用被patch后的值。
  • 如果不想修改原函数结构,也可以通过封装辅助类/方法间接提供变量值,但这种方式会增加代码复杂度,不如模块级变量的方案简洁直观。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:02:52