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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 21:17:11