node.js - Node : Unable to mock aws-sdk methods

标签 node.js amazon-web-services unit-testing jestjs aws-sdk

我尝试了许多在互联网上找到的有关模拟 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 中所有服务的原型(prototype)都没有定义的方法,我明白为什么他们创建了像 aws-sdk-mock 这样的模块,但即使该模块也没有帮助我,那么我如何才能找到一种正确的方法来在非函数 lambda 处理程序中模拟 aws 服务?

最佳答案

要在 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({}),
}))

关于node.js - Node : Unable to mock aws-sdk methods,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56228239/

相关文章:

python - 在 AWS Glue 中导入 Python 模块

javascript - 如何在单元测试中将商店注入(inject) Ember.Service?

node.js - 一饮而尽 : Cannot delete files outside the current working directory

javascript - 如何在前端 apollo-client 上处理来自 Node/Koa 的后端错误

linux - 如何使用用户数据在 AWS 上的 linux 中启动 init.d 等系统服务

amazon-web-services - 无法从 AWS 注销 AMI, "an error occurred attempting to deregister amis"。有谁知道原因并提供解决方案?

unit-testing - Unity PerRequestLifetimeManager 单元测试

c# - 我应该安装哪个版本的 VS 以允许在构建服务器上进行单元测试?

javascript - 如何在 Windows 上将 SIGUSR1 与 node.js 一起使用

node.js - 如何使用 Mongoose 在 MongoDB 中插入 JSON 数组