在Django中编写Python unittest用例如何模拟redis.StrictRedis连接
模拟Redis连接函数最简方案
不需要引入fakeredis等第三方依赖,直接使用Python标准库unittest.mock即可完成模拟,实现成本极低。
你提到的返回格式Redis<ConnectionPool<Connection<host=127.0.0.1,port=6379,db=0>>>的含义为:已成功连接到本地127.0.0.1地址6379端口、使用0号数据库的Redis实例。
方案1:仅模拟连接返回(无需操作Redis)
如果你的测试逻辑只需要验证连接方法的返回结果,不需要实际调用Redis的读写接口,可以直接构造符合格式要求的模拟对象:
from unittest.mock import Mock, patch # 替换为你自己的模块路径导入RedisCache from your_module import RedisCache def test_redis_conn(): # 构造模拟Redis连接对象 mock_redis = Mock() # 定制对象的字符串表示,匹配你需要的返回格式 mock_redis.__repr__ = Mock(return_value="Redis<ConnectionPool<Connection<host=127.0.0.1,port=6379,db=0>>>") # 打桩替换set_connect方法,直接返回模拟对象 with patch.object(RedisCache, 'set_connect', return_value=mock_redis): conn = RedisCache.get_conn() # 验证返回结果符合预期 print(conn) # 输出:Redis<ConnectionPool<Connection<host=127.0.0.1,port=6379,db=0>>> assert RedisCache.redis_instance == mock_redis
方案2:需模拟Redis基础读写操作
如果你的测试逻辑还要用到set/get/del等Redis基础能力,可以给模拟对象追加对应的模拟方法,用字典做内存存储模拟Redis行为:
from unittest.mock import Mock, patch from your_module import RedisCache def test_redis_operation(): # 用字典模拟Redis的内存存储 mock_store = {} mock_redis = Mock() mock_redis.__repr__ = Mock(return_value="Redis<ConnectionPool<Connection<host=127.0.0.1,port=6379,db=0>>>") # 模拟Redis set方法 def mock_set(key, value, *args, **kwargs): mock_store[key] = value return True mock_redis.set = mock_set # 模拟Redis get方法 def mock_get(key, *args, **kwargs): return mock_store.get(key) mock_redis.get = mock_get # 模拟Redis delete方法 def mock_delete(*keys): delete_count = 0 for key in keys: if key in mock_store: del mock_store[key] delete_count += 1 return delete_count mock_redis.delete = mock_delete # 打桩替换原连接方法 with patch.object(RedisCache, 'set_connect', return_value=mock_redis): conn = RedisCache.get_conn() # 验证读写逻辑正常 conn.set("test_key", "test_value") assert conn.get("test_key") == "test_value" conn.delete("test_key") assert conn.get("test_key") is None
你可以根据自身测试需要,灵活给模拟对象追加任意Redis方法的模拟逻辑,无需依赖任何第三方包。
内容的提问来源于stack exchange,提问作者ninjacode
相关产品推荐
相关产品推荐

