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

如何用fakeredis-py测试redis.asyncio的action_base_result函数

解决fakeredis-py测试全局Redis依赖函数的问题

问题本质是你创建的fakeredis连接池没有替换掉action_base_result函数依赖的全局redis_pool变量,导致函数内部调用的仍是未初始化的None,从而触发AttributeError。以下是无需修改原函数参数的解决方案:

方案1:直接替换全局变量

假设你的业务代码结构如下:

# business_module.py
redis_pool = None

def create_redis_pool():
    global redis_pool
    # 真实Redis初始化逻辑
    import redis
    redis_pool = redis.ConnectionPool(host="localhost", port=6379)

def action_base_result(arg1, arg2):
    with redis_pool.pipeline() as pipe:
        # 业务逻辑示例
        pipe.set(f"key_{arg1}", arg2)
        pipe.execute()

测试时直接导入全局redis_pool并替换为fakeredis的连接池:

# test_business.py
import fakeredis
from business_module import action_base_result, redis_pool

def test_action_base_result():
    # 创建fakeredis连接池
    fake_pool = fakeredis.ConnectionPool()
    # 替换全局redis_pool
    business_module.redis_pool = fake_pool

    # 执行测试
    action_base_result("test_id", "test_value")

    # 验证Redis操作结果
    fake_client = fakeredis.Redis(connection_pool=fake_pool)
    assert fake_client.get("key_test_id") == b"test_value"

方案2:用pytest monkeypatch优雅替换(推荐)

使用pytest的monkeypatch工具可以避免测试后污染全局变量,更适合自动化测试场景:

# test_business.py
import fakeredis
import pytest
from business_module import action_base_result

def test_action_base_result(monkeypatch):
    # 创建fakeredis连接池
    fake_pool = fakeredis.ConnectionPool()

    # 替换全局redis_pool变量
    import business_module
    monkeypatch.setattr(business_module, "redis_pool", fake_pool)

    # 执行测试逻辑
    action_base_result("test_id", "test_value")

    # 验证操作
    fake_client = fakeredis.Redis(connection_pool=fake_pool)
    assert fake_client.get("key_test_id") == b"test_value"

额外注意事项

  • 如果测试过程中可能触发create_redis_pool函数(它会重新赋值全局redis_pool),需要同时mock该函数:
    def test_action_base_result(monkeypatch):
        fake_pool = fakeredis.ConnectionPool()
        monkeypatch.setattr(business_module, "redis_pool", fake_pool)
    
        # 拦截create_redis_pool,防止覆盖fake_pool
        def mock_create_pool():
            business_module.redis_pool = fake_pool
        monkeypatch.setattr(business_module, "create_redis_pool", mock_create_pool)
    
        # 执行测试
        action_base_result("test_id", "test_value")
    
  • 确保测试前全局redis_pool未被真实初始化,否则需要先重置为None再替换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 15:47:47