Тестирование моделей Mongoose может быть сложной задачей, потому что вам нужно написать тесты, которые не мешают вашей реальной базе данных. Пакет сервера памяти MongoDB предлагает простое решение. Он позволяет хранить данные испытаний в памяти приложения.
В этом руководстве вы создадите простую модель Mongoose и напишете тесты, используя Jest и сервер памяти MongoDB.
Что такое сервер памяти MongoDB?
Последнее, что вам нужно, — это сохранить поддельные данные в вашей реальной базе данных, что может произойти, если вы подключитесь к ней во время тестирования. Вместо этого вы можете использовать отдельный локальный экземпляр MongoDB для хранения ваших данных. Хотя это работает, это невозможно, если ваши тесты выполняются в облаке. Кроме того, подключение и запросы к реальной базе данных во время каждого теста могут быть дорогостоящими.
Сервер памяти MongoDB, однако запускает настоящий сервер MongoDB и позволяет хранить тестовые данные в памяти. Это делает его быстрее, чем использование локальной базы данных MongoDB, поскольку данные не записываются на физический диск.
Создание модели мангуста
Модели Mongoose предоставляют интерфейс для взаимодействия с базой данных MongoDB. Чтобы их создать, вам нужно скомпилировать их из схемы Mongoose, который определяет вашу модель данных MongoDB. В этом руководстве будет использоваться схема документа списка дел. Он будет содержать заголовок и заполненные поля.
Выполните следующую команду в терминале, чтобы создать новую папку и перейти к ней.
mkdir мангуст-модель-тест
CD мангуст-модель-тест
Инициализируйте npm с помощью следующей команды:
инициализация npm -y
-у флаг указывает npm создать файл package.json со значениями по умолчанию.
Выполните эту команду, чтобы установить мангуста упаковка:
нпм установить мангуста
Создайте новый файл с именем todo.model.js и определите схему todo:
константа мангуст = требовать("мангуста")
константа {Схема} = мангуст
константа TodoSchema = новый Схема({
вещь: {
тип: Нить,
требуется: истинный
},
завершено: {
тип: логический,
требуется: истинный
}
})
В конце этого файла создайте и экспортируйте модель todo:
модуль.экспорт = mongoose.model("Todo", TodoSchema)
Планирование тестов
При написании тестов вы хотите заранее спланировать, что вы будете тестировать. Это гарантирует, что вы протестируете все функциональные возможности вашей модели.
Из созданной нами модели Mongoose задача должна содержать элемент типа String и заполненное поле типа Boolean. Оба эти поля являются обязательными. Это означает, что, как минимум, наш тест должен обеспечивать:
- Действительные элементы успешно сохранены в базе данных.
- Элементы без обязательных полей не сохраняются.
- Элементы с полями недопустимого типа не сохраняются.
Мы напишем эти тесты в одном тестовом блоке, так как они связаны. В Jest вы определяете этот тестовый блок с помощью описывать функция. Например:
описывать('Тест модели Todo', () => {
// Здесь находятся ваши тесты
}
Настройка базы данных
Чтобы настроить сервер памяти MongoDB, вы создадите новый экземпляр сервера памяти Mongo и подключитесь к Mongoose. Вы также создадите функции, которые будут отвечать за удаление всех коллекций в базе данных и отключение от экземпляра сервера памяти Mongo.
Выполните следующую команду для установки mongodb-сервер-памяти.
нпм установить mongodb-Память-сервер
Создайте новый файл с именем setuptestdb.js и импортируйте mongoose и mongodb-memory-server.
константа мангуст = требовать("мангуста");
константа { МонгоМемориСервер } = требовать("mongodb-memory-server");
Затем создайте функцию connectDB(). Эта функция создает новый экземпляр сервера памяти Mongo и подключается к Mongoose. Вы будете запускать его перед всеми тестами для подключения к тестовой базе данных.
позволять монго = нулевой;
константа подключить БД = асинхронный () => {
монго = Ждите MongoMemoryServer.create();
константа uri = монго.getUri();
Ждите mongoose.connect (ури, {
использовать ньюурлпарсер: истинный,
использовать унифицированную топологию: истинный,
});
};
Создайте функцию dropDB(), добавив следующий код. Эта функция удаляет базу данных, закрывает соединение Mongoose и останавливает экземпляр сервера памяти Mongo. Вы запустите эту функцию после завершения выполнения всех тестов.
константа dropDB = асинхронный () => {
если (монго) {
Ждитемангуста.связь.dropБаза данных();
Ждитемангуста.связь.Закрыть();
Ждите монго.стоп();
}
};
Последняя функция, которую вы создадите, называется dropCollections(). Из него выпадают все созданные коллекции Mongoose. Вы будете запускать его после каждого теста.
константа dropCollections = асинхронный () => {
если (монго) {
константа коллекции = Ждите мангуст.connection.db.collections();
за (позволять коллекция из коллекции) {
Ждите коллекция.удалить();
}
}
};
Наконец, экспортируйте функции conenctDB(), dropDB() и dropCollections().
модуль.экспорт = {connectDB, dropDB, dropCollections}
Написание тестов
Как уже упоминалось, вы будете использовать Jest для написания тестов. Выполните следующую команду, чтобы установить jest.
нпм установить шутка
в пакет.json файл, настроить шутку. Замените существующий блок «скрипты» следующим:
"сценарии": {
"тест": "шутка --runInBand --detectOpenHandles"
},
"шутка": {
"тестовая среда": "узел"
},
Создайте новый файл с именем todo.model.test.js и импортируйте библиотеку mongoose, модель todo и функции conenctDB(), dropDB() и dropCollections():
константа мангуст = требовать("мангуста");
константа {connectDB, dropDB, dropCollections} = требовать(""./setupdb");
константа Сделать = требовать("./todo.model");
Вам нужно запустить функцию connectDB() перед запуском всех тестов. С Jest вы можете использовать метод beforeAll().
Вам также необходимо запустить функции очистки. После каждого теста запускайте функцию dropCollections() и функцию dropDB() после всех тестов. Вам не нужно делать это вручную, вы можете использовать методы afterEach() и afterAll() из Jest.
Добавьте следующий код в файл todo.model.test.js, чтобы настроить и очистить базу данных.
перед всем(асинхронный () => {
Ждите подключить БД();
});после всего(асинхронный () => {
Ждите сбросить БД();
});
после каждого(асинхронный () => {
Ждите УдалитьКоллекции();
});
Теперь вы готовы к созданию тестов.
Первый тест проверит, был ли элемент задачи успешно вставлен в базу данных. Он проверит, присутствует ли идентификатор объекта в созданном для и соответствуют ли данные в нем тем, которые вы отправили в базу данных.
Создайте блок описания и добавьте следующий код.
описывать("Тодо Модель", () => {
Это("должен успешно создать элемент списка задач", асинхронный () => {
позволять действительныйTodo = {
вещь: "Помыть посуду",
завершенный: ЛОЖЬ,
};
константа новыйTodo = Ждите Todo (действительныйTodo);
Ждите новоеЗадание.сохранить();
ожидать(новыйTodo._я бы).быть определенным();
ожидать(новыйTodo.вещь).быть(действительныйTodo.вещь);
ожидать(новыйTodo.завершенный).быть(действительныйTodo.завершенный);
});
});
Этот создает новый документ в базе данных содержащий данные в переменной validTodo. Затем возвращенный объект проверяется на соответствие ожидаемым значениям. Чтобы этот тест прошел, возвращаемое значение должно иметь идентификатор объекта. Кроме того, значения в элементе и заполненных полях должны совпадать со значениями в объекте validTodo.
Помимо тестирования обычного варианта использования, вам также необходимо протестировать неудачный вариант использования. Из запланированных нами тестов вам нужно протестировать модель мангуста с объектом todo, с отсутствующим обязательным полем и одним с неправильным типом.
Добавьте второй тест в тот же блок описания следующим образом:
Это("должен завершиться ошибкой для элемента списка дел без обязательных полей", асинхронный () => {
позволять недействительныйTodo = {
вещь: "Помыть посуду",
};
пытаться {
константа новыйTodo = новый Тодо (invalidTodo);
Ждите новоеЗадание.сохранить();
} ловить (ошибка) {
ожидать(ошибка).toBeInstanceOf(мангуста.Ошибка.Ошибка проверки);
ожидать(ошибка.ошибки.завершенный).быть определенным();
}
});
Модель Todo mongoose ожидает как элемент, так и заполненные поля. Если вы попытаетесь сохранить задачу без одного из этих полей, должно появиться сообщение об ошибке. Этот тест использует блок try…catch для перехвата сгенерированной ошибки. Тест предполагает, что ошибки будут ошибкой проверки мангуста и связаны с отсутствующим заполненным полем.
Чтобы проверить, выдает ли модель ошибку при использовании значений неправильного типа, добавьте следующий код в блок описания.
Это("должен завершиться ошибкой для элемента списка дел с полями неправильного типа", асинхронный () => {
позволять недействительныйTodo = {
вещь: "Помыть посуду",
завершенный: "ЛОЖЬ"
};
пытаться {
константа новыйTodo = новый Тодо (invalidTodo);
Ждите новоеЗадание.сохранить();
} ловить (ошибка) {
ожидать(ошибка).toBeInstanceOf(мангуста.Ошибка.Ошибка проверки);
ожидать(ошибка.ошибки.завершенный).быть определенным();
}
});
Обратите внимание, что значение заполненного поля является строкой, а не логическим значением. Тест ожидает, что будет выдана ошибка проверки, поскольку модель ожидает логическое значение.
MongoMemoryServer и Jest — отличная команда
Пакет mongo-memory-server npm предоставляет простое решение для тестирования моделей Mongoose. Вы можете хранить фиктивные данные в памяти, не затрагивая базу данных вашего приложения.
Вы можете использовать MongoMemoryServer с Jest для написания тестов для моделей Mongoose. Обратите внимание, что он не охватывает все возможные тесты, которые вы можете написать для своих моделей. Эти тесты будут зависеть от вашей схемы.