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

如何使用Jest测试async函数updateSession的多场景单元测试用例?

没问题,我帮你搞定了这三个Jest测试用例的实现,完全贴合你的需求,代码里加了详细注释,方便你理解每一步的逻辑:

Jest测试代码实现

首先我们需要先mock掉依赖的EventEmitter和数据库交互模块dbModel,避免测试依赖真实环境:

const { EventEmitter } = require('events');
const updateSession = require('./your-module-path'); // 替换成你的updateSession所在文件路径

// Mock数据库模块
jest.mock('./your-dbModel-path', () => ({
  update: jest.fn()
}));
const dbModel = require('./your-dbModel-path');

describe('updateSession function', () => {
  let emitter;
  const center_id = 123; // 固定测试用的center_id
  const session_id = 'sess_abc123'; // 固定测试用的session_id

  beforeEach(() => {
    // 每次测试前创建新的EventEmitter实例,避免测试间污染
    emitter = new EventEmitter();
    // 重置mock函数的调用记录
    dbModel.update.mockReset();
    // 默认让dbModel.update返回true,模拟数据库更新成功的场景
    dbModel.update.mockResolvedValue(true);
  });

  // 测试用例1:传入包含两个容量属性的data
  test('should emit updateSession event with both available_capacity1 and available_capacity2 when data has both properties', async () => {
    const testData = { available_capacity1: 4, available_capacity2: 6 };
    // 监听updateSession事件,用Promise捕获事件数据
    const eventPromise = new Promise(resolve => {
      emitter.on('updateSession', (eventData) => {
        resolve(eventData);
      });
    });

    // 调用待测试函数
    await updateSession(emitter, dbModel, center_id, session_id, testData);

    // 验证事件数据符合预期
    const receivedEventData = await eventPromise;
    expect(receivedEventData.data).toHaveProperty('available_capacity1', 4);
    expect(receivedEventData.data).toHaveProperty('available_capacity2', 6);
    // 额外验证固定格式字段
    expect(receivedEventData.data.center_id).toBe(`k${center_id}`);
    expect(receivedEventData.data.session_id).toBe(session_id);
    expect(receivedEventData.operationType).toBe('update');
    expect(receivedEventData.operationOn).toBe('session');
  });

  // 测试用例2:传入仅包含available_capacity1的data
  test('should emit updateSession event with only available_capacity1 when data has only that property', async () => {
    const testData = { available_capacity1: 4 };
    const eventPromise = new Promise(resolve => {
      emitter.on('updateSession', (eventData) => {
        resolve(eventData);
      });
    });

    await updateSession(emitter, dbModel, center_id, session_id, testData);

    const receivedEventData = await eventPromise;
    // 验证目标属性存在且值正确
    expect(receivedEventData.data).toHaveProperty('available_capacity1', 4);
    // 验证另一个属性不存在
    expect(receivedEventData.data).not.toHaveProperty('available_capacity2');
    // 验证固定字段
    expect(receivedEventData.data.center_id).toBe(`k${center_id}`);
    expect(receivedEventData.data.session_id).toBe(session_id);
  });

  // 测试用例3:传入仅包含available_capacity2的data
  test('should emit updateSession event with only available_capacity2 when data has only that property', async () => {
    const testData = { available_capacity2: 6 };
    const eventPromise = new Promise(resolve => {
      emitter.on('updateSession', (eventData) => {
        resolve(eventData);
      });
    });

    await updateSession(emitter, dbModel, center_id, session_id, testData);

    const receivedEventData = await eventPromise;
    expect(receivedEventData.data).toHaveProperty('available_capacity2', 6);
    expect(receivedEventData.data).not.toHaveProperty('available_capacity1');
    expect(receivedEventData.data.center_id).toBe(`k${center_id}`);
    expect(receivedEventData.data.session_id).toBe(session_id);
  });
});

关键说明:

  • 用jest.mock模拟数据库模块,彻底脱离真实数据库环境,保证测试的独立性和稳定性;
  • 每个测试前重置mock和创建新的EventEmitter实例,避免不同测试用例之间的数据污染;
  • 通过Promise异步捕获事件触发的数据,解决Jest中异步事件的断言时机问题;
  • 除了满足你要求的属性验证,额外补充了固定格式字段的断言,让测试覆盖更全面。

内容的提问来源于stack exchange,提问作者me.nkr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 18:12:30