我正试图编写一个测试来测试一个连接到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();
    });
});

蒙哥马利.getConnection代码:

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

推荐答案

关于使用MongoDB作为数据存储的单元测试代码,有几个答案:

我将try 整合这些解决方案.

Preamble

首先,您希望MongoDB在执行测试时运行.MongoDB的查询语言非常复杂,因此需要对稳定的MongoDB实例运行合法的查询,以确保查询按计划运行,并且应用程序正确响应结果.然而,考虑到这一点,您应该针对生产系统运行测试,而不是针对集成环境的外围系统.这可能与您的CI软件位于同一台机器上,或者只是相对靠近它(就流程而言,不一定是网络或地理位置而言).

这个环境可能占用空间小,完全在内存(resource 1)(resource 2)中运行,但不一定需要与生产环境相同的性能特征.(如果要进行性能测试,无论如何都应该在与CI不同的环境中进行.)

Setup

  • Install a 100 service specifically for CI.如果repl集合和/或分片有问题(例如写问题、不使用$isolated等),可以通过在同一台机器上运行多个mongod实例(1个配置,2x2个数据用于分片+repl)和一个mongos实例,并使用一些初始化来模拟集群环境.d脚本/调整或类似docker的东西.
  • Use environment-specific configurations在应用程序中(通过.json文件嵌入,或在/etc、/home/user/.your app或类似的地方).您的应用程序可以基于node environment variable like NODE_ENV=int加载这些.在这些配置中,您的db连接字符串将有所不同.如果您正在使用特定于env的配置,那么开始这样做是为了抽象应用程序运行时设置(即"local"、"dev"、"int"、"pre"、"prod"等).I can provide a sample upon request.
  • Include test-oriented fixtures with your application/testing suite.正如其中一个链接问题所述,MongoDB的 node .js驱动程序支持一些助手库:mongodb-fixtures and node-database-cleaner.fixture为测试提供了一个工作且一致的数据集:可以将其视为 bootstrap .

Builds/Tests

  1. 使用node-database-cleaner之类的东西清理关联的数据库.
  2. mongodb-fixtures的帮助下,将设备填充到现在已空的数据库中.
  3. 执行构建和测试.
  4. 重复

On the other hand...

如果您仍然认为not运行MongoDB是正确的方法(and you wouldn't be the only one),那么使用ORM从驱动程序中提取数据存储调用是最好的 Select (对于整个应用程序,而不仅仅是测试).例如,model claims to be database agnostic之类的东西,尽管我从未使用过.使用这种方法,您仍然需要fixturesenv configurations,但是不需要安装MongoDB.这里需要注意的是,你要受你 Select 的ORM的摆布.

Mongodb相关问答推荐

防止查找简单字段

我无法将文档发送到我的MongoDB集合,因为它告诉我使文档无效

为什么 mongoose 在 mongodb 中找不到我的数据

MongoDB:如何从数组中的所有对象中删除属性?

MongoDB - 将数组元素转换为新字段

lexik_jwt_authentication下无法识别的选项api_platform

如何使用指南针连接到 mongodb replicaset (k8s)

System.FormatException occurred in MongoDB.Bson.dll - XXX is not a valid 24 digit hex string

通过 _id 更新一个文档(无效的 BSON 字段名称 _id)

使用 homebrew 和 Xcode 8.1.1 安装 Mongodb 失败

Node.js 数据库的抽象层

在mongodb中实现分页

$lookup 结果 mongodb 的计数

使用 brew upgrade Mongo update from 3.4 to 4.0 报错:在try 升级到 4.0 之前,数据文件需要完全升级到 3.6 版

Node + Mongoose:获取最后插入的 ID?

C# mongodb driver 2.0 - 如何在批量操作中更新插入?

MongoDb:如何将附加对象插入对象集合?

MongoDB count() 未定义

MongoDB限制内存

Meteor订阅不更新集合的排序顺序