асинхронный импорт в jest.mock, чтобы сохранить файл макета отдельно и повторно использовать его для других тестов

#typescript #jestjs #mocking #ts-jest #babel-jest

Вопрос:

Я пытаюсь выполнить импорт внутри своего шутливого макета, чтобы использовать отдельный файл для воспроизведения одного и того же макета в нескольких кодах. Моделирование ниже:

 const listCache: Array = [];

jest.mock('aws-sdk', () => {
const MockAWS = import('../../mocks/DynamoRepositoryMock');

// MockAWS.default(listCache);
return MockAWS;
});
 

Когда я запускаю свой тест, я получаю следующую ошибку:

Ошибка типа: Не удается прочитать свойство «обновление» неопределенного

  11 | function configs() {
  12 |   console.log(AWS.config);
> 13 |   AWS.config.update({
     |              ^
  14 |     region: config.AWS.REGION,
  15 |     dynamodb: {
  16 |       endpoint: config.DYNAMO.ENDPOINT,
 

Я заметил, что мой макет поступает как обещание в коде, где я ссылаюсь на DynamoDB, поэтому я понимаю, что именно поэтому он не идентифицирует параметр макета.
вот мой макет DynamoDB:

 import { AWSError } from 'aws-sdk';
import { DocumentClient } from 'aws-sdk/clients/dynamodb';

const MockAWS = (list: Array) => {
const config = {
update: jest.fn(() => ({
region: 'region-mock',
dynamodb: {
endpoint: 'dynamodb-mock',
},
})),
};
/*
Deve ser inicializado um array vazio
Por conta do hoisting do Jest, o jest.mock é executado antes mesmo dos imports

O array é inicializado vazio, e depois é feito o push dos dados de teste, caso contrário dá ruim.
*/
const listCache: Array = list;

return {
config,
DynamoDB: {
DocumentClient: jest.fn(() => ({
put: jest.fn((
params: DocumentClient.PutItemInput,
callback?: (err: AWSError, data: DocumentClient.PutItemOutput) => void,
) => {
listCache.push(
params.Item as T,
);

      callback(null, null);
    }),
    update: jest.fn((
      params: DocumentClient.UpdateItemInput,
      callback?: (err: AWSError, data: DocumentClient.UpdateItemOutput) => void,
    ) => {
      const keys = Object.entries(params.Key);
      const index = listCache.findIndex((t) => {
        let result = false;

        // eslint-disable-next-line no-restricted-syntax
        for (const key of keys) {
          result = t[key[0]] === key[1];
          if (!result) break;
        }
        return resu<
      });

      const atts = Object.entries(params.ExpressionAttributeValues);

      atts.forEach((t) => {
        // eslint-disable-next-line prefer-destructuring
        listCache[index][t[0].substr(1)] = t[1];
      });

      callback(null, null);
    }),
    delete: jest.fn((
      params: DocumentClient.DeleteItemInput,
      callback?: (err: AWSError, data: DocumentClient.DeleteItemOutput) => void,
    ) => {
      const keys = Object.entries(params.Key);
      const index = listCache.findIndex((t) => {
        let result = false;

        // eslint-disable-next-line no-restricted-syntax
        for (const key of keys) {
          result = t[key[0]] === key[1];
          if (!result) break;
        }
        return resu<
      });

      delete listCache[index];

      callback(null, null);
    }),
    get: jest.fn((
      params: DocumentClient.GetItemInput,
      callback?: (
        err: AWSError,
        data: DocumentClient.GetItemOutput
      ) => void,
    ) => {
      const keys = Object.entries(params.Key);
      const item = listCache.find((t) => {
        let result = false;

        // eslint-disable-next-line no-restricted-syntax
        for (const key of keys) {
          result = t[key[0]] === key[1];
          if (!result) break;
        }
        return resu<
      });

      callback(null, {
        Item: item,
      });
    }),
    scan: jest.fn((
      params: DocumentClient.ScanInput,
      callback?: (
        err: AWSError,
        data: DocumentClient.ScanOutput
      ) => void,
    ) => {
      /*
            Com a implementação abaixo, N filtros podem ser usados
           */
      const keys = Object.entries(params.ExpressionAttributeValues);

      const result = params.ExpressionAttributeValues
        ? listCache.filter((t) => {
          // Mudar o nome dessa variável horrível
          let resultDois = false;
          // eslint-disable-next-line no-restricted-syntax
          for (const key of keys) {
            resultDois = t[key[0].substr(1)] === key[1];
            if (!resultDois) break;
          }
          return resultDois;
        }) : listCache;

      callback(null, {
        Items: result,
        Count: result.length,
      });
    }),
  })),
},
};
};

export default MockAWS;