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

Python Celery单元测试中如何Mock Redis连接及Redis存储的测试数据

单元测试Mock Redis实现方案

核心思路

你代码中的Redis实例是在ReferenceData类的__init__方法中初始化绑定到实例属性的,单元测试时不需要启动真实Redis服务,直接用Mock对象替换真实Redis实例即可,同时可以自定义Mock的方法行为来模拟存储/读取数据的逻辑。

具体实现步骤

我们以Python标准库unittest.mock为例,两种常用实现方式如下:

方式1:直接替换实例的redis属性(灵活度高,适合单测单个方法)

import pytest
from unittest.mock import Mock
from your_module import ReferenceData # 替换为你实际的模块导入路径

def test_save_raisr_event_transcription():
    # 1. 初始化任务实例,替换内部redis属性为Mock对象
    task = ReferenceData()
    mock_redis = Mock()
    task.redis = mock_redis

    # 2. 补全测试上下文参数(你贴的代码存在变量未定义问题,测试前需自行补全业务逻辑)
    test_crn = "test_crn_001"
    test_trans = "测试转写内容"
    # 构造业务需要的event入参,补全trans、crn等变量的赋值逻辑

    # 3. 调用待测试方法
    result = task.save_raisr_event(event)

    # 4. 验证逻辑正确性
    assert result == 'transcription saved'
    # 验证redis append方法被正确调用,key和存储值符合预期
    mock_redis.append.assert_called_once_with(f"{test_crn}-transcription", f" {test_trans}")

def test_read_existed_transcription():
    # 模拟Redis中已存储的transcription值场景
    task = ReferenceData()
    mock_redis = Mock()
    # 注意:原生StrictRedis默认返回bytes类型,如果你初始化时加了decode_responses=True则直接返回字符串即可
    mock_redis.get.return_value = b"已存储的历史转写内容"
    task.redis = mock_redis

    # 调用你的读Redis业务逻辑
    stored_val = task.redis.get(f"{test_crn}-transcription")
    assert stored_val == b"已存储的历史转写内容"

方式2:Patch全局Redis类(适合批量测试,不需要逐个修改实例属性)

import pytest
from unittest.mock import Mock, patch
from your_module import ReferenceData

@patch("your_module.redis.StrictRedis")
def test_patch_redis(mock_strict_redis):
    # 配置全局mock的StrictRedis实例行为
    mock_redis_instance = Mock()
    mock_strict_redis.return_value = mock_redis_instance
    # 模拟真实Redis append方法返回追加后的字符串长度
    mock_redis_instance.append.return_value = 32

    # 初始化任务时,内部的self.redis会自动替换为mock实例
    task = ReferenceData()

    # 后续测试逻辑和方式1一致
    test_crn = "test_crn_002"
    test_trans = "新转写内容"
    task.save_raisr_event(event)
    mock_redis_instance.append.assert_called_once_with(f"{test_crn}-transcription", f" {test_trans}")

提示:你贴的代码存在语法错误和未定义变量,比如get_agents方法结尾缺少右括号,save_raisr_event方法内的trans、crn、transcription都没有定义,实际测试前需要先修正这些问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:06:05