使用redis-mock进行Node-TypeScript单元测试失败问题求助
问题排查与修复
核心问题1:beforeAll中的异步连接未执行
你的beforeAll回调里定义了异步函数但未调用,导致Redis客户端从未完成连接,后续set/get操作自然无法正常工作,最终返回undefined。
修复后的连接代码
import { createClient, RedisClientType } from 'redis'; let client: RedisClientType; beforeAll(async () => { client = createClient({ url: "redis://localhost:6379", }); try { await client.connect(); } catch (error) { console.error('Error connecting redis', error); } }); afterAll(async () => { await client.disconnect(); });
核心问题2:未正确用redis-mock模拟Redis客户端
如果测试依赖redis-mock,必须确保测试环境中redis模块被替换为redis-mock的实现,否则代码会尝试连接真实Redis服务(本地未启动时直接报错)。
两种替换方式:
- 方式1:在jest.config.js中配置模块映射
module.exports = { // 其他配置项... moduleNameMapper: { '^redis$': 'redis-mock' } };
- 方式2:在测试文件顶部手动Mock
jest.mock('redis', () => require('redis-mock')); // 后续调用的createClient会自动使用redis-mock的模拟客户端
验证修复后的测试用例
调整后的测试用例可正常执行,还能验证set方法的返回值:
describe('Redis', () => { it('should set user info in Redis', async () => { const userInfo = { id: 1, name: 'John Doe' }; const token = 'some-token'; const setResult = await client.set(token, JSON.stringify(userInfo)); expect(setResult).toBe('OK'); // redis-mock的set方法返回"OK" const result = await client.get(token); expect(result).toEqual(JSON.stringify(userInfo)); }); });
额外注意事项
- 确保已安装依赖:
npm install redis-mock --save-dev - TypeScript类型适配:若遇类型错误,可安装
@types/redis-mock(若存在),或必要时使用类型断言
内容的提问来源于stack exchange,提问作者John Oliver
相关产品推荐
相关产品推荐

