Узел: невозможно смоделировать методы aws-sdk - PullRequest
0 голосов
/ 21 мая 2019

Я перепробовал много методов поиска служб 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, но даже этот модуль мне не помог, так как я могу сделать правильный способ издеваться над службами aws в не функциональном лямбда-обработчике?

1 Ответ

0 голосов
/ 21 мая 2019

Чтобы смоделировать сторонний пакет в jest, вы можете создать каталог __mocks__ на том же уровне, что и ваш node_modules, который будет содержать ваши проверенные функции.

Например,

.
├── 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({}),
}))
...