Модульное тестирование функционального кода с зависимостями (AWS Lambda et c) - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть приложение, написанное на 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, которого я, вероятно, предпочел бы избежать.

Может кто-нибудь дать мне совет, как подходить к таким ситуациям? Ссылка на статью или что-то подобное также будет цениться, поскольку я не смог найти ничего, что определенно описывало бы лучшие практики для этого.

...