AWS Node.js Lambda函数测试:编写handler测试并验证方法调用
没问题!我来给你写一套简单的测试用例,既能验证Lambda的handler逻辑,又能确保mySQLWriter方法被正确调用。我们用Jest来做测试——这是Node.js生态里最常用的测试框架,上手快还好用。
第一步:安装测试依赖
首先在你的项目里安装Jest:
npm install --save-dev jest
第二步:编写测试文件
创建一个index.test.js文件,和你的index.js放在同一目录下,代码如下:
const { handler } = require('./index'); const mySQLWriter = require('./mySQLWriterService'); // 把mySQLWriter整个模块mock掉,这样我们不用真的操作数据库就能跟踪调用 jest.mock('./mySQLWriterService'); describe('Lambda Handler Tests', () => { // 每个测试前重置mock的调用记录,避免测试之间互相干扰 beforeEach(() => { mySQLWriter.mockReset(); }); // 测试:收到INSERT记录时,mySQLWriter会被调用 test('triggers mySQLWriter for INSERT records', async () => { // 构造一个模拟的Lambda事件(模拟DynamoDB Stream的格式,你可以根据实际情况调整字段) const mockEvent = { Records: [ { eventName: 'INSERT', dynamodb: { NewImage: { id: { S: 'test-id-1' }, data: { S: 'test-content' } } } }, // 加一个MODIFY记录,验证不会触发mySQLWriter { eventName: 'MODIFY', dynamodb: { NewImage: { id: { S: 'test-id-2' }, data: { S: 'updated-content' } } } } ] }; // 用Promise包装handler调用,因为Lambda的callback是异步的,Jest需要等待它完成 await new Promise((resolve, reject) => { handler(mockEvent, {}, (err, res) => { err ? reject(err) : resolve(res); }); }); // 验证mySQLWriter只被调用了1次,而且传入的是那条INSERT的记录 expect(mySQLWriter).toHaveBeenCalledTimes(1); expect(mySQLWriter).toHaveBeenCalledWith(mockEvent.Records[0]); }); // 测试:没有INSERT记录时,mySQLWriter不会被调用 test('does NOT trigger mySQLWriter when no INSERT records exist', async () => { const mockEvent = { Records: [ { eventName: 'MODIFY' }, { eventName: 'REMOVE' } ] }; await new Promise((resolve, reject) => { handler(mockEvent, {}, (err, res) => { err ? reject(err) : resolve(res); }); }); // 确认mySQLWriter一次都没被调用 expect(mySQLWriter).not.toHaveBeenCalled(); }); });
第三步:运行测试
在package.json里添加一个测试脚本:
{ "scripts": { "test": "jest" } }
然后运行:
npm test
一些额外说明
- 如果你
mySQLWriter是异步函数(比如返回Promise),记得在测试里模拟它的返回值,比如用mySQLWriter.mockResolvedValue('success'),这样handler的异步流程能正常走完。 - 你可以根据实际的event结构调整
mockEvent里的字段,比如如果你的事件不是来自DynamoDB Stream,就改成对应的格式。 - 要是需要测试多个INSERT记录的场景,只需要在
mockEvent.Records里多加几条eventName: 'INSERT'的记录,然后断言mySQLWriter被调用的次数和对应的参数就行。
内容的提问来源于stack exchange,提问作者J86
相关产品推荐
相关产品推荐

