У меня есть приложение, написанное на Java, которое работает на Kubernetes, и я портирую его на AWS Lambda как приложение Node. Теперь я хочу попытаться сделать его как можно более «функциональным», избегая шаблонов OOP, таких как внедрение зависимостей и т. Д. c.
Проблема, с которой я сталкиваюсь, заключается в том, что часто для выполнения некоторых действий внутри функции Мне нужно вызывать такие вещи, как AWS SDK, чтобы загрузить объект в корзину S3, что либо усложняет юнит-тестирование, либо вынуждает меня добавлять дополнительные параметры или использовать каррирование для прохождения клиента S3, а не создавать его экземпляр внутри функции.
Вот пример:
const region: string = properties.aws.region
const pollyClient = new AWS.Polly({
region
})
export default async function textToSpeech (text: string): Promise<Buffer> {
const params: AWS.Polly.Types.SynthesizeSpeechInput = {
Text: text,
OutputFormat: properties.polly.outputFormat,
VoiceId: properties.aws.polly.voice
}
return await new Promise<Buffer>((resolve, reject) => {
pollyClient.synthesizeSpeech(params, (err, data) => {
if (typeof err !== 'undefined') {
reject(err)
} else {
if (data.AudioStream instanceof Buffer) {
resolve(data.AudioStream)
}
}
})
})
}
Здесь мне нужен клиент AWS Polly для преобразования текста в речь, и в настоящее время я использую замыкание для его создания, что означает, что для модульного тестирования функции я буду Мне нужен фактический вызов Polly API, которого я, вероятно, предпочел бы избежать.
Может кто-нибудь дать мне совет, как подходить к таким ситуациям? Ссылка на статью или что-то подобное также будет цениться, поскольку я не смог найти ничего, что определенно описывало бы лучшие практики для этого.