#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 уже создан (это не заглушка, а фактическая реализация). Следовательно, когда вы вызываете функцию, она будет использовать существующий экземпляр вместо заглушки, которую вы ожидаете.