Как выполнить модульное тестирование метода, который подключается к монго, фактически не подключаясь к монго?
Я пытаюсь написать тест, чтобы протестировать метод, который подключается к Монго, но на самом деле я не хочу, чтобы Монго работал, а на самом деле выполнял подключение к нему, чтобы мои тесты прошли успешно.
Вот мой текущий тест, который проходит успешно, когда работает мой демон Монго.
describe('with a valid mongo string parameter', function() {
it('should return a rejected promise', function(done) {
var con = mongoFactory.getConnection('mongodb://localhost:27017');
expect(con).to.be.fulfilled;
done();
});
});
mongoFactory.getConnection code:
getConnection: function getConnection(connectionString) {
// do stuff here
// Initialize connection once
MongoClient.connect(connectionString, function(err, database) {
if (err) {
def.reject(err);
}
def.resolve(database);
});
return def.promise;
}
2 ответа
Есть пара ответов SO, связанных с модульным тестированием кода, который использует MongoDB в качестве хранилища данных:
- Пересмешивать базу данных в node.js?
- Макет / тестирование базы данных Mongodb Node.js
- Встроенный MongoDB при запуске интеграционных тестов
- Аналогично: классы модульного тестирования с онлайн-функциональностью
Я сделаю попытку консолидации этих решений.
преамбула
Прежде всего, вы должны захотеть, чтобы MongoDB работал во время выполнения ваших тестов. Язык запросов MongoDB является сложным, поэтому выполнение законных запросов для стабильного экземпляра MongoDB необходимо для обеспечения того, чтобы ваши запросы выполнялись в соответствии с планом и чтобы ваше приложение правильно реагировало на результаты. Имея это в виду, однако, вы никогда не должны запускать свои тесты против производственной системы, а вместо этого использовать периферийную систему в вашей среде интеграции. Это может быть на той же машине, что и ваше программное обеспечение CI, или просто относительно близко к ней (с точки зрения процесса, не обязательно сетевого или географически).
Этот ENV может занимать мало места и полностью работать в памяти ( ресурс 1) ( ресурс 2), но не обязательно требует тех же характеристик производительности, что и производственный ENV. (Если вы хотите провести тест производительности, это все равно должно выполняться отдельно от вашего CI.)
Настроить
- Установить
mongod
Сервис специально для КИ. Если наборы реплеев и / или шардинг имеют значение (напр., Пишите, не используйте$isolated
и т. д.), можно имитировать кластерную среду, запустив несколькоmongod
экземпляры (1 конфиг, 2x2 данные для шарда + репл) иmongos
Экземпляр на той же машине с некоторыми сценариями / настройками init.d или чем-то вроде Docker. - Используйте специфичные для среды конфигурации в вашем приложении (либо встроенные в файлы.json, либо в такие места, как / etc, /home/user/.your-app или аналогичные). Ваше приложение может загрузить их на основе переменной среды узла, например
NODE_ENV=int
, В этих конфигурациях ваши строки подключения БД будут отличаться. Если вы не используете специфичные для env конфиги, начните делать это как средство для абстрагирования настроек времени выполнения приложения (то есть "local", "dev", "int", "pre", "prod" и т. Д.). Я могу предоставить образец по запросу. - Включите ориентированные на тестирование светильники с вашим приложением / комплектом тестирования. Как упоминалось в одном из связанных вопросов, драйвер Node.js MongoDB поддерживает некоторые вспомогательные библиотеки:
mongodb-fixtures
а такжеnode-database-cleaner
, Приспособления предоставляют рабочий и согласованный набор данных для тестирования: думайте о них как о начальной загрузке.
Строит / тесты
- Очистите связанную базу данных, используя что-то вроде
node-database-cleaner
, - Заполните ваши приборы в теперь пустой базе данных с помощью
mongodb-fixtures
, - Выполните сборку и тестирование.
- Повторение.
С другой стороны...
Если вы по-прежнему решаете, что не работает MongoDB - это правильный подход ( и вы не будете единственным), то лучше всего абстрагировать вызовы хранилища данных от драйвера с помощью ORM (для всего приложения, а не только для тестирования)., Например, что-то вроде model
утверждает, что не зависит от базы данных, хотя я никогда не использовал его. Используя этот подход, вам все равно потребуются фиксаторы и конфигурации env, однако вам не потребуется устанавливать MongoDB. Предостережение заключается в том, что вы находитесь в зависимости от выбранного вами ORM.
Вы можете попробовать tingodb.
TingoDB - это встроенная файловая система JavaScript в процессе или база данных в памяти, совместимая с MongoDB на уровне API.