Как unit test метод, который соединяется с монго, без фактического подключения к монго?

Я пытаюсь написать тест, чтобы протестировать метод, который подключается к mongo, но на самом деле я не хочу, чтобы у меня работало mongo и на самом деле подключалось к нему, чтобы мои тесты прошли успешно.

Здесь мой текущий тест, который успешный, когда работает мой демон mongo.

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;
    }

Ответ 1

Есть несколько SO-ответов, связанных с модулем модульного тестирования, который использует MongoDB в качестве хранилища данных:

Я попытаюсь объединить эти решения.

Преамбула

Прежде всего, вы должны использовать MongoDB во время выполнения своих тестов. Язык запросов MongoDB является сложным, поэтому для обеспечения того, чтобы ваши запросы выполнялись в соответствии с запланированными, требуются законные запросы против стабильного экземпляра MongoDB и что ваше приложение правильно отвечает на результаты. Помня об этом, вы никогда не должны запускать тесты против производственной системы, а вместо этого - периферийную систему для вашей среды интеграции. Это может быть на той же машине, что и ваше программное обеспечение CI, или просто относительно близко к ней (с точки зрения процесса, не обязательно в сети или географически).

Эта ENV может быть низкой и полностью запущена в памяти (ресурс 1) (ресурс 2), но не обязательно потребует тех же характеристик, что и ваша продукция ENV. (Если вы хотите выполнить тест производительности, это должно быть обработано в отдельной среде от вашего CI в любом случае.)

Настройка

  • Установить службу mongod специально для CI.. Если набор repl и/или sharding вызывают озабоченность (например, беспокоиться о записи, не использовать $isolated и т.д.), можно имитирует кластерную среду, запуская несколько экземпляров mongod (1 config, 2x2 data для shard + repl) и экземпляр mongos на той же машине с некоторыми скриптами/твиками init.d или что-то вроде докера.
  • Используйте конфигурацию, специфичную для среды в вашем приложении (либо встроенную через .json файлы, либо в некотором месте, например, /etc,/home/user/.your-app или аналогичные). Ваше приложение может загрузить их на основе переменной node, как NODE_ENV=int. В этих конфигурациях ваши строки соединения db будут отличаться. Если вы не используете env-specific configs, начните делать это как средство для абстрагирования настроек времени выполнения приложения (т.е. "Local", "dev", "int", "pre", "prod" и т.д.). Я могу предоставить образец по запросу.
  • Включить тестовые ориентиры с вашим приложением/набором тестов. Как упоминалось в одном из связанных вопросов, драйвер MongoDB node.js поддерживает некоторые вспомогательные библиотеки: mongodb-fixtures и node-database-cleaner. Светильники обеспечивают рабочий и согласованный набор данных для тестирования: считайте их загрузочными.

Сборки/тесты

  • Очистите связанную базу данных, используя что-то вроде node-database-cleaner.
  • Настройте свои приборы в теперь пустую базу данных с помощью mongodb-fixtures.
  • Выполните сборку и проверку.
  • Повтор.

С другой стороны...

Если вы все еще решите, что не работает MongoDB, это правильный подход (и вы не будете единственным), а затем абстрагирование вызовов хранилища данных от драйвера с ORM - ваш лучший выбор (для всего приложения, а не только для тестирования). Например, что-то вроде model претендует на агностику базы данных, хотя я никогда не использовал его. Используя этот подход, вам все равно потребуются настройки и настройки env, однако вам не потребуется устанавливать MongoDB. Опасность здесь заключается в том, что вы находитесь во власти ORM, которую вы выбираете.

Ответ 2

Вы можете попробовать tingodb.

TingoDB - встроенная встроенная JavaScript-система или база данных в памяти, совместимая с MongoDB на уровне API.