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

