Как написать содержательный интеграционный тест для простой оболочки микросервиса серверной части Node.js DynamoDB

Интеграционный тест - это проверка того, что система из нескольких модулей (например, микрослужба) работает должным образом. В этом руководстве мы напишем узкий интеграционный тест, который подразумевает, что тестовые двойники (моки) могут использоваться для некоторых внешних зависимостей (статья Мартина Фаулера).

DynamoDB - это быстрое и гибкое хранилище ключей и значений NoSQL. В нашем примере нам нужно выполнить только две основные операции - PutItem (создать или заменить) и GetItem (найти по первичному ключу).

Наш микросервис реализует RESTful API. Написан на TypeScript с использованием Express framework. Для работы DynamoDB мы используем пакет aws-sdk.

Давайте сосредоточимся на нашей операции get. Нам нужно обработать простой HTTP-запрос, в какой-то момент вызвать класс Repository для извлечения данных из DynamoDB и в конечном итоге вернуть ответ с чем-то на его основе.

Как уже упоминалось, мы собираемся написать «узкий» интеграционный тест, что означает, что мы можем использовать тестовый дублер для базы данных. В коде приложения мы работаем с DynamoDB Client только в нашем классе Repository. Давайте посмотрим на его метод get:

DocumentClient поставляется с пакетом aws-sdk npm, в котором он уже протестирован. Он не является частью кода нашего приложения, поэтому кажется хорошим кандидатом для создания тестового двойника.

Чтобы проверить, правильно ли наше приложение интегрировано с DocumentClient, мы должны сделать следующее:

  • утверждать, что объект params, который мы передаем методу get, является тем, чем он должен быть;
  • принудительно использовать метод get для возврата данных, которые мы указали в тесте

Для этого мы воспользуемся тестовой библиотекой Sinon. Он приносит пользу всей динамической мощи JavaScript - с Sinon мы можем удобно имитировать / шпионить за любой функцией любого прототипа! Давайте посмотрим, как мы справимся с DocumentClient в нашем тесте.

Во-первых, нам нужно инициализировать песочницу Sinon, а поскольку мы собираемся изменить прототипы объектов, нам нужно указать Jest восстанавливать все в нем после каждого теста:

Пришло время инициализировать заглушку - она ​​может как имитировать возвращаемое значение функции, так и следить за переданными ей параметрами:

Затем, используя супертест, мы можем выполнить запрос к нашему приложению и сделать тестовые утверждения. Несмотря на то, что экземпляр DocumentClient в настоящий момент даже не существует, его прототип уже зарезервирован. Это означает, что все экземпляры DocumentClient будут вести себя как заглушки, пока мы не восстановим песочницу Sinon.

В результате мы можем протестировать наше простое приложение от начала до конца, за исключением стороннего DynamoDB DocumentClient, который мы вставили в заглушку.

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

Бонус. При таком подходе мы можем заставить даже стандартные встроенные объекты иметь настраиваемое поведение. Например, мы можем заставить Date.toString () возвращать некоторую фиксированную строку в наших тестах. Конечно, это может привести к чрезмерному усложнению и появлению тестовых ошибок, поэтому это не кажется хорошей практикой.