инициализация интерфейса s3 внутри или снаружи функции

#amazon-web-services #amazon-s3 #jestjs #aws-sdk

Вопрос:

В настоящее время у нас есть:

 export function s3Call(action: string, params: any): Promise<any> {
  const s3 = new AWS.S3();
  return s3[action](params).promise();
}
 

Я попытался изменить его на:

 const s3 = new AWS.S3();

export function s3Call(action: string, params: any): Promise<any> {
  return s3[action](params).promise();
}
 

Однако при запуске модульного теста я получил следующую ошибку:

не удалось получить текущий подсегмент/сегмент из контекста новый s3

введите описание изображения здесь

Сам модульный тест довольно прост:

 describe("uploadImage tests", () => {
  it("should return correct image url", async () => { 
    process.env.IMAGE_UPLOAD_BUCKET_NAME = 'TestBucket'; 
    process.env.AWS_REGION = 'us-west-2';

    const putObject = jest.fn().mockImplementation(() => Promise.resolve({}));
    AWSMock.mock('S3', 'putObject', putObject);
    const bucketUrl = https://${process.env.IMAGE_UPLOAD_BUCKET_NAME}.s3-${process.env.AWS_REGION}.amazonaws.com/; 

    const result = await uploadImage(imageData, bucketUrl); 

    expect(result).toContain(process.env.IMAGE_UPLOAD_BUCKET_NAME); 
    expect(result).toContain(process.env.AWS_REGION); 

    AWSMock.restore('S3');
  });
});
 

Как можно один раз инициализировать интерфейс s3? и почему мы видим эту ошибку один раз, когда инициализация s3 выводится из функции?

Комментарии:

1. Вы уверены, что можете использовать s3 объект в качестве массива? Каковы некоторые примеры значений action в вашем приложении?

Ответ №1:

Я полагаю, что вы используете пакет aws-sdk-макет узла, чтобы издеваться над своей службой S3.

В документации сказано,

Служба AWS должна быть инициализирована внутри тестируемой функции, чтобы метод SDK был издевательским

Причина в том, что при импорте файла, s3Call содержащегося в вашем тесте, экземпляр службы s3 уже создан (это не заглушка, а фактическая реализация). Следовательно, когда вы вызываете функцию, она будет использовать существующий экземпляр вместо заглушки, которую вы ожидаете.