Освоение модульного тестирования с помощью NestJS
Модульное тестирование - это процесс разработки программного обеспечения, в ходе которого мельчайшие тестируемые части приложения, называемые модулями, индивидуально проверяются на предмет правильной работы. В этом руководстве мы рассмотрим пример модульного тестирования в Node.js используя фреймворк NestJS. Мы сосредоточимся на тестировании класса BookService, рассмотрим его методы создания и извлечения книг, а также продемонстрируем лучшие практики тестирования.
Предварительные условия
Прежде чем погрузиться в модульное тестирование, убедитесь, что у вас есть базовое представление о Node.js, NestJS, Jest и MongoDB.
Настройка среды
Для начала давайте настроим среду, создав файл book.service.ts
. Кроме того, мы установим и импортируем все необходимые зависимости и создадим класс BookService
.
Далее приступим к разработке функции генерации новой записи книги с использованием MongoDB и библиотеки Mongoose.
Затем разработайте функцию для поиска книги по ее идентификатору.
Аналогично, создайте функцию для обновления книги.
Наконец, создайте функцию для удаления книги.
Unit-тестирование BookService
Теперь, когда мы углубимся в процесс модульного тестирования класса BookService
, наша цель — убедиться, что каждая функция работает именно так, как задумано.
Инициализация среды тестирования
Сначала создайте файл book.service.spec.ts
в том же каталоге, что и файл book.service
.
При модульном тестировании NestJS классы Test
и TestingModule
из @nestjs/testing
устанавливают среду тестирования. Для имитации взаимодействия с базой данных используется функция getModelToken
из @nestjs/mongoose
. С помощью функции jest.fn()
создается макет BookService для отслеживания вызовов методов. Этот макет службы и моделируемая модель базы данных предоставляются путем настройки модуля тестирования с помощью getModelToken(Book.name)
. После компиляции доступ к экземпляру и модели BookService осуществляется с помощью метода Module.get()
.
Тестирование функции 'create' BookService
В этом тестовом сценарии мы создаем макет объекта, имитирующий новую книгу. Затем мы создаем макет реализации функции create
в модели для решения с помощью нашей предопределенной макетной книги. Вызывая функцию create
нашей службы с данными макетной книги, мы гарантируем, что служба отвечает ожидаемым образом. Оператор expect
подтверждает, что результат соответствует нашей предопределенной макетной книге, тем самым проверяя правильность функции create
. Также инициализируйте все необходимые зависимости.
Тестирование функции 'findById' BookService
В этом тестовом сценарии мы начинаем с импорта основных зависимостей и создания объекта mockBook
. Этот объект будет служить заполнителем для моделирования атрибутов и свойств книги во время наших тестов.
Затем мы тщательно тестируем функцию findById
. Мы объявили три тестовых случая.
- Первый тестовый пример гарантирует, что функция правильно находит и возвращает книгу по ее идентификатору. Мы достигаем этого, имитируя функцию
findById
модели для разрешения с помощью нашей предопределенной макетной книги, а затем проверяя, соответствует ли результат ожиданию. - Последующие тестовые примеры обрабатывают сценарии ошибок. Во втором тестовом примере мы моделируем недопустимый идентификатор и утверждаем, что вызов
findById
с этим идентификатором вызывает исключениеBadRequestException
. Мы достигаем этого, имитируя функциюisValidObjectId
, чтобы она возвращалаfalse
, а затем используя ожидание для подтверждения выданной ошибки. - Третий тестовый пример проверяет условие, при котором функция
findById
не может найти запрошенную книгу. Мы имитируем функциюfindById
модели, чтобы она возвращала значениеnull
, имитируя сценарий, в котором книга не найдена. Как и ожидалось, затем мы проверяем, вызывает ли вызовfindById
с этим идентификатором исключениеNotFoundException
.
Тестируя эти различные сценарии, мы гарантируем, что наша функция findById
работает правильно и обрабатывает исключения должным образом.
Тестирование функции 'updateById' BookService
В этом тестовом сценарии мы проверяем работоспособность обновления и возврата информации о книге. Тестовый сценарий включает моделирование обновления названия книги и подтверждение того, что обновленный объект книги возвращается должным образом.
Во время выполнения теста вызывается функция updateById
службы с соответствующим идентификатором книги и обновленными данными книги. Фокальная реализация гарантирует, что служба взаимодействует с методом findByIdAndUpdate
модели, как и предполагалось.
Тестирование функции 'deleteById' BookService
Тест гарантирует, что функция deleteById
успешно удаляет книгу и возвращает ожидаемый результат. Имитируя операцию с базой данных с помощью findByIdAndDelete
, мы проверяем, что функция правильно взаимодействует с моделью данных.
Запуск тестовых сценариев
После завершения наших тестовых сценариев, охватывающих различные аспекты функциональности нашего приложения, пришло время увидеть их в действии.
Необходимо убедиться, что вы находитесь в корневом каталоге вашего проекта Nest.js, выполните следующие действия:
- Откройте терминал или командную строку.
- Введите следующую команду:
npm run test
Эта команда инициирует выполнение ваших модульных тестов с использованием среды тестирования, которую мы установили ранее.
Запуск тестов — важный шаг в обеспечении надежности и правильности вашей кодовой базы.
Заключение
В этом руководстве мы рассмотрели основные концепции модульного тестирования в NestJS, включая настройку модулей тестирования, создание фиктивных сервисов и выполнение тестовых примеров.