首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >节点:无法模拟aws-sdk方法

节点:无法模拟aws-sdk方法
EN

Stack Overflow用户
提问于 2019-05-21 05:11:29
回答 2查看 1.4K关注 0票数 2

我已经尝试了很多我在互联网上找到的关于模仿aws-sdk服务的方法,但没有一个对我有效,我甚至尝试过aws-sdk-mock模块,但它不起作用,我想这是因为我没有在函数处理程序中使用aws-sdk

我使用jest作为我的测试运行器和断言,所以我现在拥有的代码如下:

test.js

代码语言:javascript
复制
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

代码语言:javascript
复制
/**
 * 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;

对于此代码,我得到的错误是:

代码语言:javascript
复制
TypeError: Cannot read property 'prototype' of undefined

这是因为sdk中的所有服务的原型在调用构造函数之前都没有定义的方法,我知道为什么他们创建了一个像aws-sdk-mock这样的模块,但即使是那个模块也没有帮助,那么我如何才能在一个非函数的lambda处理程序中模拟aws服务呢?

EN

回答 2

Stack Overflow用户

发布于 2019-05-21 09:20:06

要在jest中模拟第三方软件包,可以在与node_modules相同的级别创建一个__mocks__目录,其中将包含模拟函数。

例如,

代码语言:javascript
复制
.
├── README.md
├── __mocks__
    └── aws-sdk.js
├── jest.config.js
├── node_modules
├── package.json
├── src
└── yarn.lock

您的aws-sdk.js模拟文件可以包含以下内容:

代码语言:javascript
复制
module.exports.CognitoIdentityServiceProvider = jest.fn(() => ({
    listUsersInGroup: mockListUsersInGroup,
}))

const mockListUsersInGroup = jest.fn((params) => ({
    // You can replace the resolved value.
    promise: () => Promise.resolve({}),
}))
票数 2
EN

Stack Overflow用户

发布于 2020-12-31 02:11:13

这件很适合我

代码语言:javascript
复制
const AWS = require('aws-sdk');
jest.mock('aws-sdk');
    
AWS.CognitoIdentityServiceProvider.prototype.listUsers = jest.fn().mockReturnValue({
      promise: jest.fn().mockResolvedValue({})
    });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56228239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档