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

如何在Python中为fakeredis程序化添加命令?

问题

是否存在无需修改库代码的方式,在Python中为fakeredis程序化添加命令?根据fakeredis文档,当前实现命令支持需修改_fakesocket.py中的FakeSocket类,但我希望避免此操作。

需求背景:正在为使用Redis-OM的应用编写单元测试,其中模型为JsonModel,该模型需Redis服务器支持Json才能实例化(其__init__方法会做此检查)。我尝试用FakeStrictRedis绕过限制,但它不支持JsonModel所需的COMMAND INFO命令。

解决方案

方法1:猴子补丁动态添加命令

无需修改fakeredis源码,直接在测试代码中对FakeSocket类打补丁,添加COMMAND INFO的处理逻辑:

from fakeredis import FakeStrictRedis
from fakeredis._fakesocket import FakeSocket

def fake_command_info(self, *args, **kwargs):
    # 模拟Redis返回JSON命令支持的信息,适配Redis-OM的检查逻辑
    if args and args[0].lower() == "json.set":
        # 按真实Redis的返回格式构造数据,确保JsonModel验证通过
        return [["JSON.SET", "summary", "1", "write", 1, 1, 1, [], 1, 0, 0, 0, "", ""]]
    return []

# 替换FakeSocket的command_info方法
FakeSocket.command_info = fake_command_info

# 正常初始化并使用
redis = FakeStrictRedis()
# 此时可正常实例化JsonModel

方法2:Mock跳过Redis支持检查

如果仅需绕过JsonModel的初始化验证,直接mock掉它的检查方法即可:

from unittest.mock import patch
from redis_om import JsonModel

def test_json_model():
    with patch.object(JsonModel, '_check_redis_json_support', return_value=None):
        # 无需Redis或fakeredis支持JSON命令,直接实例化模型
        model = JsonModel(your_field="test")
        # 执行后续测试逻辑

方法3:扩展FakeStrictRedis类

继承FakeStrictRedis并自定义命令处理逻辑,避免修改源码:

from fakeredis import FakeStrictRedis

class JSONFakeRedis(FakeStrictRedis):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # 给内部socket替换command_info方法
        self._socket.command_info = self._custom_command_info

    def _custom_command_info(self, *args, **kwargs):
        # 针对JSON命令返回支持信息,其他命令沿用原有逻辑
        if args and any(cmd.startswith("JSON.") for cmd in args):
            return [["JSON.SET", "summary", "1", "write", 1, 1, 1, [], 1, 0, 0, 0, "", ""]]
        return self._socket._original_command_info(*args, **kwargs)

# 使用自定义的FakeRedis实例
redis = JSONFakeRedis()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 06:13:23