如何在 Jest 中为无服务器 Nodejs Lambda 模拟 AWS DynamoDB?

2024-04-23

我写了一个 lambda 如下。

处理程序.js

const aws = require('aws-sdk');
const dynamoDb = new aws.DynamoDB.DocumentClient();

const testHandler = async event => {
  // some code
  // ...
  const user = await getUser(userId)
  // ...
  // some code
}

const promisify = foo => new Promise((resolve, reject) => {
  foo((error, result) => {
    if (error) {
      reject(error)
    } else {
      resolve(result)
    }
  })
})

const getUser = (userId) => promisify(callback =>
  dynamoDb.get({
    TableName: 'test-table',
    Key: {
      "PK": `${userId}`,
      "SK": `${userId}`
    }
  }, callback))
  .then((user) => {
    console.log(`Retrieved user: ${userId}`)
    return user
  })


module.exports = {
  testHandler: testHandler,
  getUser: getUser
}

我想编写一个单元测试来测试getUser功能所以我尝试了以下操作。

处理程序.test.js

const handler = require('../handler');
const AWS = require('aws-sdk')

const dynamoDbGetParameterPromise = jest.fn().mockReturnValue({
  promise: jest.fn().mockResolvedValue({
    PK: 'userId-123', SK: 'userId-123'
  })
})

AWS.DynamoDB.DocumentClient = jest.fn().mockImplementation(() => ({
  get: dynamoDbGetParameterPromise
}))


describe('test getUser', () => {

  beforeEach(() => {
    jest.resetModules()
  });

  test('get user success', async () => {
    const user = { PK: 'userId-123', SK: 'userId-123' };
    const result = await handler.getUser(userId);
    expect(result).toEqual(user);
  });
});

错误如下。

ConfigError: Missing region in config

      105 |
      106 | const getUser = (userId) => promisify(callback =>
    > 107 |   dynamoDb.get({
          |            ^
      108 |     TableName: 'test-table',
      109 |     Key: {
      110 |       "PK": 'userId-123',

看来测试还是用的dynamoDb in the handler.js而不是测试中被嘲笑的人。

关于如何正确连接模拟来测试功能有什么想法吗? 提前致谢!


您可以通过添加来使用 jest 的自动模拟

jest.mock("aws-sdk");

进而AWS.DynamoDB.DocumentClient将是一个模拟类,因此您将能够模拟它的实现。因为我们希望它的 get 方法成为一个接受任何内容作为第一个参数的函数(因为我们不会在模拟实现中对它做任何事情)和一个我们期望它被调用的回调null and user我们可以这样嘲笑它:

AWS.DynamoDB.DocumentClient.prototype.get.mockImplementation((_, cb) => {
  cb(null, user);
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Jest 中为无服务器 Nodejs Lambda 模拟 AWS DynamoDB? 的相关文章

随机推荐