如何在Jest中嘲笑AWS DynamoDB for Serverless NodeJS Lambda? [英] How to mock AWS DynamoDB in Jest for Serverless Nodejs Lambda?

查看:0
本文介绍了如何在Jest中嘲笑AWS DynamoDB for Serverless NodeJS Lambda?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我编写了一个lambda,如下所示。

handler.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函数,于是我尝试了以下方法。

handler.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',

该测试似乎仍然使用handler.js中的dynamoDb,而不是测试中模拟的。

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

推荐答案

您可以通过添加

jest.mock("aws-sdk");

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

AWS.DynamoDB.DocumentClient.prototype.get.mockImplementation((_, cb) => {
  cb(null, user);
});

这篇关于如何在Jest中嘲笑AWS DynamoDB for Serverless NodeJS Lambda?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆