如何在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
相关产品推荐
相关产品推荐

