Недавно я написал веб-приложение, использующее AWS User Cognito SDK для JavaScript. Обычно я использую Jest для тестирования своего кода JavaScript и искал способ модульного тестирования функций, которые использовали объекты из SDK.

Некоторые из этих объектов выполняют вызовы API, поэтому мне нужно было имитировать каждый объект. Издевательство над модулем также позволило бы мне утверждать, что объекты и методы внутри этих объектов были созданы и вызваны.

В этом руководстве мы рассмотрим имитацию amazon-cognito-identity-js и написание модульных тестов для вашего кода.

Создать макет модуля

Создайте каталог __mocks__ в корне вашего репозитория, а затем в этом каталоге каталог amazon-cognito-identity-js:

  • __mocks __ / амазонка-когнито-идентичность-js

Затем мы собираемся реплицировать объекты, доступные в SDK.

  • __mocks __ / амазонка-когнито-идентичность-js / index.js
  • __mocks __ / amazon -ognito-identity-js / CognitoUserPool.js

Настройка Jest для использования фиктивного модуля

Вам нужно сообщить Jest, что макет модуля существует в каталоге __mocks__. Jest предоставляет moduleNameMapper ключ, которому вы можете назначить объект, отображающий имя фиктивного модуля на путь фиктивного модуля.

В конфигурации Jest (обычно в package.json) добавьте следующее:

"moduleNameMapper": {
  "amazon-cognito-identity-js": "<rootDir>/__mocks__/amazon-cognito-identity-js/index.js"
}

Теперь всякий раз, когда вы импортируете из amazon-cognito-identity-js в своих тестах, вы фактически импортируете из макета модуля.

Мокинг CognitoUserPool

В файл __mocks__/amazon-cognito-identity-js/CognitoUserPool.js добавьте следующий объект:

function CognitoUserPool(data) {
  const { UserPoolId, ClientId } = data;
  this.userPoolId = UserPoolId;
  this.clientId = ClientId;
  this.getCurrentUser = jest.fn().mockReturnValue('cognitouserpool');
}
module.exports = CognitoUserPool;

Обратите внимание на использование внутри этого объекта метода getCurrentUser. Это заменяет функциональность реального модуля функцией Jest. Это позволит нам утверждать, что этот метод объекта вызван, и с правильными параметрами.

Теперь экспортируйте макет CognitoUserPool в файл index.js:

module.exports = {
  CognitoUserPool: jest.fn().mockImplementation(
    require('./CognitoUserPool')
  )
}

Ваш макет-модуль, содержащий объект CognitoUserPool, теперь готов к использованию в ваших модульных тестах. Вы можете импортировать из макета следующим образом:

import { CognitoUserPool } from 'amazon-cognito-identity-js';

Я могу проверить, что CognitoUserPool был вызван с правильными параметрами, используя .toHaveBeenCalledWith Jest:

expect(CognitoUserPool).toHaveBeenCalledWith({
  UserPoolId: <USER_POOL_ID>,
  ClientId: <CLIENT_ID>
});
expect(CognitoUser).toHaveBeenCalledWith({
  Username: <USERNAME>,
  Pool: "cognitouserpool" // return value of CognitoUserPool
});

Если у вас есть несколько тестовых примеров, обязательно каждый раз очищайте фиктивную функцию с помощью afterEach:

afterEach(() => {
  CognitoUserPool.mockClear();
});