Как макетировать экземпляр класса внутри функции без внедрения зависимостей - PullRequest
0 голосов
/ 02 июня 2019

Я пишу модульный тест для службы, которая использует aws-sdk для вывода списка всех файлов из корзины s3. Внутри функции я создаю экземпляр класса S3 и использую listObjectsV2, который извлекает файлы из корзины S3, в тесте я должен насмехаться над этой функцией, чтобы вернуть фиктивные данные.

Проблема в том, что я не могу найти способ смоделировать экземплярный класс для переопределения функции, я не хочу передавать объект S3 в параметре (внедрение зависимости)

aws.service:

listAllFiles = (bucket: string, documentsPath: string): Promise<ObjectList> => {
    const params: S3.ListObjectsV2Request = {
      Bucket: bucket,
      EncodingType: 'url',
      StartAfter: documentsPath
    };
    return this.listAllFilesCore(params);
  }

  private listAllFilesCore(params: S3.ListObjectsV2Request): Promise<ObjectList> {
    return new Promise<ObjectList>((resolve, reject) => {
      let result: ObjectList = []; const s3bucket = new S3(this.config);
      s3bucket.listObjectsV2(params, (err, data) => {
        if (err) {
          logger.error(err.message);
          logger.error(err.stack);
          reject(err);
        } else {
          result = result.concat(data.Contents);
          if (data.IsTruncated) {
            logger.debug('get further list...');
            this.listAllFilesCore(Object.assign(params, { ContinuationToken: data.NextContinuationToken }))
              .then(r => {
                result = result.concat(r);
                resolve(result);
              });
          } else {
            logger.debug(`get S3 Success from ${params.StartAfter}`);
            resolve(result);
          }
        }
      });
    });
  }
  let awsService: any;
  beforeAll(() => {
    jest.mock('aws-sdk/clients/s3');
    awsService = require('./aws.service').awsService;
  });

  it('listAllFiles from S3', () => {
    const S3 = require('aws-sdk/clients/s3');
    S3.listObjectsV2 = jest.fn((param: any,
      callback?: (err: any, data: any) => void) => {
      callback(undefined, data2);
    });

Я получаю сообщение об ошибке: s3bucket.listObjectsV2 не является функцией

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...