Освоение модульного тестирования с помощью NestJS
![](/static/storage/51803527083901097568511812177173543737.png)
Модульное тестирование - это процесс разработки программного обеспечения, в ходе которого мельчайшие тестируемые части приложения, называемые модулями, индивидуально проверяются на предмет правильной работы. В этом руководстве мы рассмотрим пример модульного тестирования в Node.js используя фреймворк NestJS. Мы сосредоточимся на тестировании класса BookService, рассмотрим его методы создания и извлечения книг, а также продемонстрируем лучшие практики тестирования.
Предварительные условия
Прежде чем погрузиться в модульное тестирование, убедитесь, что у вас есть базовое представление о Node.js, NestJS, Jest и MongoDB.
Настройка среды
Для начала давайте настроим среду, создав файл book.service.ts
. Кроме того, мы установим и импортируем все необходимые зависимости и создадим класс BookService
.
![](/static/storage/81529881025481662375220376121274623918.jpg)
Далее приступим к разработке функции генерации новой записи книги с использованием MongoDB и библиотеки Mongoose.
![](/static/storage/258068408012241106046692064643698183205.png)
Затем разработайте функцию для поиска книги по ее идентификатору.
![](/static/storage/280119033216636353207479279417005692961.png)
Аналогично, создайте функцию для обновления книги.
![](/static/storage/78514123388846435985177672134380840625.png)
Наконец, создайте функцию для удаления книги.
![](/static/storage/153608920701363450170342735623041027814.png)
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()
.
![](/static/storage/241367522663703755025927532806243157759.png)
Тестирование функции 'create' BookService
В этом тестовом сценарии мы создаем макет объекта, имитирующий новую книгу. Затем мы создаем макет реализации функции create
в модели для решения с помощью нашей предопределенной макетной книги. Вызывая функцию create
нашей службы с данными макетной книги, мы гарантируем, что служба отвечает ожидаемым образом. Оператор expect
подтверждает, что результат соответствует нашей предопределенной макетной книге, тем самым проверяя правильность функции create
. Также инициализируйте все необходимые зависимости.
![](/static/storage/251198493515380802856831018144362470601.png)
Тестирование функции 'findById' BookService
В этом тестовом сценарии мы начинаем с импорта основных зависимостей и создания объекта mockBook
. Этот объект будет служить заполнителем для моделирования атрибутов и свойств книги во время наших тестов.
![](/static/storage/200369832404871659938520437034052656081.png)
Затем мы тщательно тестируем функцию findById
. Мы объявили три тестовых случая.
- Первый тестовый пример гарантирует, что функция правильно находит и возвращает книгу по ее идентификатору. Мы достигаем этого, имитируя функцию
findById
модели для разрешения с помощью нашей предопределенной макетной книги, а затем проверяя, соответствует ли результат ожиданию. - Последующие тестовые примеры обрабатывают сценарии ошибок. Во втором тестовом примере мы моделируем недопустимый идентификатор и утверждаем, что вызов
findById
с этим идентификатором вызывает исключениеBadRequestException
. Мы достигаем этого, имитируя функциюisValidObjectId
, чтобы она возвращалаfalse
, а затем используя ожидание для подтверждения выданной ошибки. - Третий тестовый пример проверяет условие, при котором функция
findById
не может найти запрошенную книгу. Мы имитируем функциюfindById
модели, чтобы она возвращала значениеnull
, имитируя сценарий, в котором книга не найдена. Как и ожидалось, затем мы проверяем, вызывает ли вызовfindById
с этим идентификатором исключениеNotFoundException
.
Тестируя эти различные сценарии, мы гарантируем, что наша функция findById
работает правильно и обрабатывает исключения должным образом.
![](/static/storage/78647711655242428805111724802363405813.png)
Тестирование функции 'updateById' BookService
В этом тестовом сценарии мы проверяем работоспособность обновления и возврата информации о книге. Тестовый сценарий включает моделирование обновления названия книги и подтверждение того, что обновленный объект книги возвращается должным образом.
Во время выполнения теста вызывается функция updateById
службы с соответствующим идентификатором книги и обновленными данными книги. Фокальная реализация гарантирует, что служба взаимодействует с методом findByIdAndUpdate
модели, как и предполагалось.
![](/static/storage/171191882763371655423873262200851285575.png)
Тестирование функции 'deleteById' BookService
Тест гарантирует, что функция deleteById
успешно удаляет книгу и возвращает ожидаемый результат. Имитируя операцию с базой данных с помощью findByIdAndDelete
, мы проверяем, что функция правильно взаимодействует с моделью данных.
![](/static/storage/142103344189791340876377727258947495422.png)
Запуск тестовых сценариев
После завершения наших тестовых сценариев, охватывающих различные аспекты функциональности нашего приложения, пришло время увидеть их в действии.
Необходимо убедиться, что вы находитесь в корневом каталоге вашего проекта Nest.js, выполните следующие действия:
- Откройте терминал или командную строку.
- Введите следующую команду:
npm run test
Эта команда инициирует выполнение ваших модульных тестов с использованием среды тестирования, которую мы установили ранее.
![](/static/storage/320634280885139200530049459930307128075.png)
Запуск тестов — важный шаг в обеспечении надежности и правильности вашей кодовой базы.
Заключение
В этом руководстве мы рассмотрели основные концепции модульного тестирования в NestJS, включая настройку модулей тестирования, создание фиктивных сервисов и выполнение тестовых примеров.