如何在Jest中嘲笑AWS DynamoDB for Serverless NodeJS Lambda? [英] How to mock AWS DynamoDB in Jest for Serverless Nodejs Lambda?
本文介绍了如何在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方法是一个接受任何内容作为第一个参数的函数(因为我们不会在模拟实现中对它做任何事情)和一个回调,所以我们希望它已经被null
和user
调用,所以我们可以这样模拟它:
AWS.DynamoDB.DocumentClient.prototype.get.mockImplementation((_, cb) => {
cb(null, user);
});
这篇关于如何在Jest中嘲笑AWS DynamoDB for Serverless NodeJS Lambda?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文