Рубрики
Без рубрики

Устройство тестирования AWS Lambda функционирует в Node.js

Написание кода Backend – как веб-сервисы или что-то еще – с AWS Lambda Functions – это AS Помечено AWS, Node, JavaScript, тестирование.

Сочинительство кода Backend – как веб-сервисы или что-то еще – с функциями AWS Lambda удивительно просто, в частности, когда вы выбираете Node.js как ваше оружие выбора. Количество кода, необходимое для прохождения, настолько редко, это почти волшебно. Однако, как вы строите свою лямбду, сложность быстро заставит голову, и вы скоро почувствуете необходимость добавления некоторых тестов.

Устройство тестирования является частью любого хорошего рабочего процесса разработчика, но я чувствую, что это особенно важно при работе с динамически напечатанными языками, как Vanilla JavaScript. Его слабо напечатанная природа делает развитие быстро, но также делает определенную степень неопределенности при внесении изменений или во время рефакторинга. Хорошее тестовое покрытие может составить для этого, и он может позволить вам работать быстрее. Если вы можете издеваться от зависимостей лямбда, вы будете очень уверены, что ваш успешный тест подразделения является представителем возможного производственного кода.

Внедрение зависимости

” Инъекция зависимостей »- это несколько интимидимидирующий термин, используемый в разработке программного обеспечения для описания чего-то совсем простого:

Инъекция зависимости – это методика программирования, которая делает класс независимо от своих зависимостей. Это достигает того, что путем развязки использования объекта из его создания.

Это наиболее полезно при применении в контексте тестирования подразделения, поскольку оно позволяет вам поднимать зависимости, которые не должны активны во время тестов.

В Node.js функции лямбда зависимости импортируются с использованием функции требуют (). Это создает постоянную в области применения функции, указывая на какой-то внешний код. По умолчанию вы сделаете это на верхнем уровне файла Node.js, эффективно делая зависимость глобально доступным для указанного файла. Рассмотрим этот фрагмент, где мы импортируем AWS SDK, и создав новый экземпляр DynamoDB DocumentClient:

const AWS = require('aws-sdk')
const documentClient = new AWS.DynamoDB.DocumentClient()

Что происходит, когда вы установили тестовый код, который импортирует вышеуказанную зависимость? В этом случае ваш тест установит живое подключение к Dynamodb и потенциально начать чтение и запись данных к нему! Хотя вы можете утверждать, что это тест в самом и сам по себе, эта ситуация далека от идеала. Каждый вызов теста на единицу будет

  • потенциально нести расходы
  • Напишите данные в живую базу данных, возможно, запутав свою консистенцию
  • быть медленным

Ричард Хайтт Средний пост от 2016 Все еще актуальны сегодня, поскольку он описывает, как мы можем сделать зависимость загрузки асинхронной и инжекториной с помощью объекта экспорта в хранение и ссылочные зависимости.

exports.deps = () => {
  const AWS = require('aws-sdk')
  const documentClient = new AWS.DynamoDB.DocumentClient()

  return Promise.resolve({
    dynamoBatchWrite: params => documentClient.batchWrite(params).promise()
  })
}

Фактическая импорт зависимости заключается в функциональной области депона, и сделан асинхронной путем упаковки в результатном словаре в обещании. Эта асинхроника позволяет перезаписывать функцию DEPS во время тестов, оставляя его как в производстве.

Производственный код просто ожидает зависимости в верхней части, после чего вы сможете получить доступ к полностью построенным зависимостям:

exports.handler = async event => {
  const deps = await exports.deps()
  ...
}

Теперь для теста:

require('chai').should()
const lambda = require('../index')
const sinon = require('sinon')

describe('importOPML', () => {
  beforeEach('mock dependencies', () => {
    const mockWriter = sinon.mock()
    mockWriter.resolves({ UnprocessedItems: [] })

    lambda.deps = () => Promise.resolve({
      dynamoBatchWrite: mockWriter
    })
  })

  it('should succeed with empty opml', async () => {
    // Using lambda here, will call the version that uses the mocked DynamoDB writer.
  }
})

Это происходит как тест Chai, который использует Sinon для издевания, но предпосылка одинакова. Перед запуском каждого тестового блока выполнено, выполняется блок-блок, который подготовит лямбда с зажимами макета.

Вот и все. Вы уходите на гонки!

Оригинал: “https://dev.to/jarroo/unit-testing-aws-lambda-functions-in-nodejs-j8h”