我已经尝试了很多我在互联网上找到的关于模仿aws-sdk服务的方法,但没有一个对我有效,我甚至尝试过aws-sdk-mock
模块,但它不起作用,我想这是因为我没有在函数处理程序中使用aws-sdk
。
我使用jest
作为我的测试运行器和断言,所以我现在拥有的代码如下:
test.js
const aws = require('aws-sdk-mock');
const Admin = require('./../../../serverless/entities/Admin');
describe('Entity - Admin test', () => {
jest.spyOn(aws.CognitoIdentityServiceProvider.prototype, 'listUsersInGroup', () => {
return {
promise: Promise.resolve({ foo: 'bar' })
};
});
const data = Admin.getListOfUsers();
console.log(data);
});
Admin.js
/**
* Admin entity class
* This class should help managing all super user actions that are required for the sportstracker's application
* Amazon services used by this entity:
* - Cognito (User Pool)
* Required IAM Policy actions:
* - cognito-idp:ListUsersInGroup
* - cognito-idp:ListUsers
* - cognito-idp:AdminCreateUser
* - cognito-idp:AdminDeleteUser
* - cognito-idp:AdminGetUser
* - cognito-idp:AdminListGroupsForUser
* - cognito-idp:AdminUpdateUserAttributes
* - cognito-idp:AdminRemoveUserFromGroup
*/
const aws = require('aws-sdk');
const User = require('./../lib/User');
const cognito = new aws.CognitoIdentityServiceProvider();
const UserPoolId = process.env['COGNITO_USER_POOL_ID'];
const rolesMap = {
admin: 'SuperUser',
member: 'Member'
};
/**
* @typedef UsersList
* @property {Array<UserObject>} members - The list of members
* @property {Array<UserObject>} admins - The list of admins
*/
class Admin {
/**
* Gets a list of users for both admin and members.
* This executes 2 methods for aws.cognito [admin, member]
* @returns {Promise<UsersList>} - The object containing the list of members and admins
*/
static async getListOfUsers () {
const operations = [
cognito.listUsersInGroup({ UserPoolId, GroupName: rolesMap.admin }).promise(),
cognito.listUsersInGroup({ UserPoolId, GroupName: rolesMap.member }).promise()
];
const results = await Promise.all(operations);
return {
admins: results[0].Users.map(user => User.mapUserData(user)),
members: results[1].Users.map(user => User.mapUserData(user))
};
}
...
}
module.exports = Admin;
对于此代码,我得到的错误是:
TypeError: Cannot read property 'prototype' of undefined
这是因为sdk中的所有服务的原型在调用构造函数之前都没有定义的方法,我知道为什么他们创建了一个像aws-sdk-mock
这样的模块,但即使是那个模块也没有帮助,那么我如何才能在一个非函数的lambda处理程序中模拟aws服务呢?
发布于 2019-05-21 09:20:06
要在jest
中模拟第三方软件包,可以在与node_modules
相同的级别创建一个__mocks__
目录,其中将包含模拟函数。
例如,
.
├── README.md
├── __mocks__
└── aws-sdk.js
├── jest.config.js
├── node_modules
├── package.json
├── src
└── yarn.lock
您的aws-sdk.js
模拟文件可以包含以下内容:
module.exports.CognitoIdentityServiceProvider = jest.fn(() => ({
listUsersInGroup: mockListUsersInGroup,
}))
const mockListUsersInGroup = jest.fn((params) => ({
// You can replace the resolved value.
promise: () => Promise.resolve({}),
}))
发布于 2020-12-31 02:11:13
这件很适合我
const AWS = require('aws-sdk');
jest.mock('aws-sdk');
AWS.CognitoIdentityServiceProvider.prototype.listUsers = jest.fn().mockReturnValue({
promise: jest.fn().mockResolvedValue({})
});
https://stackoverflow.com/questions/56228239
复制相似问题