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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:58:43