Часто мы создаем модели мангуста, запускаем наши серверы и никогда не пытаемся проверить, действительно ли модели работают независимо от сервера, как должны.

В этой статье будет показано, как выполнить модульное тестирование вашей модели Mongoose с помощью Jest.

Установка зависимостей

Мы бы создали базовый проект, содержащий нашу модель и тестовые файлы. Инициализируем проект узла и устанавливаем все необходимые зависимости.

npm init -y
npm i mongoose crypto jest mongodb-memory-server

Так что у нас здесь?

Mongoose: мы будем использовать mongoose для взаимодействия с нашей базой данных mongo.

крипто: мы используем его для хеширования нашего пароля, вы увидите его использование позже в этом руководстве.

Jest: библиотека для тестирования, которую мы будем использовать. Если вы хотите узнать больше о шутке и ознакомиться с ее особенностями, отметьте это.

mongodb-memory-server: это версия базы данных mongo в памяти, которую мы будем использовать. Это избавляет нас от стресса, связанного с необходимостью создавать настоящую базу данных mongo. Он также подключается к основной памяти устройства и не хранится физически на диске, поэтому он быстрее и удобнее для тестирования. Подробнее об этом пакете можно прочитать здесь.

Структура проекта

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

В этом примере мы будем создавать только одну модель: модель пользователей.

Создайте новую папку под названием модели; затем создайте в нем файл под названием user.js. Структура вашего кода должна выглядеть примерно так:

Схема пользователя

Во вновь созданный файл user.js мы добавляем следующий код:

В приведенном выше коде мы устанавливаем схему пользователя в мангусте и создаем два метода: setPassword и validatePassword. Мы используем эти методы для генерации хешированного пароля пользователя, а также для проверки пароля пользователя соответственно.

Настройка тестовой среды

Прежде чем мы напишем наш тест, нам нужно будет интегрировать наш сервер памяти mongo в наш проект. Для этого мы создаем новую папку с именем db в основе нашего проекта, а затем внутри этой папки создаем новый файл с именем setup.js.

Наша новая структура кода должна выглядеть так:

Затем откройте db.js и добавьте этот код. Вкратце я объясню, что здесь происходит:

Объяснение

Прежде всего, мы импортируем две наши зависимости: mongoose и MongoMemoryServer.

Затем мы создаем 3 метода, а именно setUp, dropDatabase, и dropCollections .

Метод setUp - это то место, где мы подключаемся к базе данных с помощью пакета MongoMemoryServer.

Метод dropDatabase используется для полного удаления базы данных, закрытия и остановки соединения.

Метод dropCollections используется для удаления всех коллекций из нашей базы данных.

Наконец, мы экспортируем эти 3 метода, так как они нам понадобятся в нашем тестовом файле.

Написание нашего теста

Момент, которого мы так долго ждали, наконец-то наступил. Мы должны написать тест!

Мне лично нравится хранить свои тесты в одной папке с файлом, который будет тестироваться, это мой личный выбор и не является обязательным.

При этом мы создадим новый файл с именем user.test.js в той же папке, где у нас есть user.js файл.

Стриктура нашего нового проекта теперь должна быть:

Теперь добавьте этот код ниже во вновь созданный файл user.test.js.

Объяснение

Выглядит довольно много, правда? Ну что ж, давайте уже в этом разбираемся.

В первом разделе мы импортируем наш установочный файл db, модель пользователя, а также mongoose.

Затем мы создаем фиктивные данные и сохраняем их в userData, мы будем использовать их для выполнения нашего теста позже в этом файле.

Затем мы добавляем три метода, а именно beforeAll, afterEach, afterAll, эти методы разрешены в шутку.

beforeAll будет выполняться перед запуском наших тестовых наборов. В этом случае у нас есть только один блок описания. В этом методе мы вызываем db.setUp, чтобы настроить наше соединение с базой данных.

afterEach запускается после каждого набора тестов. Если бы у нас было несколько блоков описания, мы бы использовали этот метод, чтобы каждый набор не влиял на результат другого. Это происходит потому, что мы вызываем db.dropCollection, который удаляет все коллекции из базы данных.

afterAll после завершения всех наборов тестов. Здесь мы отбрасываем базу данных и закрываем соединение с помощью метода db.dropDatabase.

Далее мы создали набор тестов и написали в нем три теста.

Первый тестовый блок: успешно создать и сохранить пользователя, мы создаем нового пользователя, а затем проверяем, действительно ли он был создан. Если вы помните в нашей схеме, у пользователя есть свойства электронной почты, телефона и соли, поэтому мы проверяем, существуют ли эти свойства в возвращаемых данных пользователя, в случае телефона и электронной почты, проверяя, действительно ли то, что было возвращено, было тем, что мы сохранили! . Кроме того, поскольку мангуст присоединяет свойство _id к схеме, мы также проверяем, существует ли оно.

Второй тестовый блок: вставка пользователя успешно, но поле, не определенное в схеме, должно быть неопределенным, мы создаем нового пользователя, но на этот раз мы передаем свойство, которое не ' не существует в схеме. Мы ожидаем, что пользователь будет создан, но это свойство не добавлено, поэтому мы проверяем, чтобы убедиться, что его нет в возвращаемых данных, ожидая, что оно не определено.

Третий тестовый блок: создание пользователя без обязательного поля должно завершиться ошибкой, мы создаем нового пользователя, как в предыдущем тесте, но на этот раз мы не передаем свойство электронной почты и поскольку это требуется в нашей схеме, mongoose не должен создавать этого конкретного пользователя. Мы оборачиваем метод сохранения в «попытаться поймать» и проверять, действительно ли полученная ошибка является ошибкой проверки мангуста, и дополнительно проверяем, что эта ошибка проверки была вызвана отсутствующим свойством электронной почты.

Запустить тест

Чтобы запустить наш тест, нам нужно будет обновить наш файл package.json и добавить отдельные команды сценария в раздел сценариев. Этот сценарий сообщает в шутку, как запустить наш тест и где найти наши тестовые файлы.

"scripts": {
"test": "jest --runInBand ./models"
},

Флаг runInBand просто указывает jest запускать все наши тесты последовательно в текущем процессе, а не создавать рабочий пул дочерних процессов. Очень полезно для отладки.

./models просто указывает jest запускать все тестовые файлы, найденные в папке моделей.

Ознакомьтесь с документацией Jest CLI здесь, чтобы увидеть дополнительные параметры, которые можно использовать.

Чтобы запустить наш тест, мы запускаем тестовый скрипт, найденный в нашем файле package.json:

npm run test

Если вы выполнили все правильно, вы должны получить эти прекрасные зеленые галочки с дисплеем терминала, как показано ниже:

Волла! Вы только что провели тесты, и все они прошли!

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

Полный код можно найти здесь. Взрыв!

Больше контента на plainenglish.io