如何对连接到mongo的方法进行单元测试,而不实际连接到mongo?

时间:2014-08-30 18:31:42

标签: node.js mongodb mocha chai chai-as-promised

我正在尝试编写测试以测试连接到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代码:

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 个答案:

答案 0 :(得分:33)

有一些与使用MongoDB作为数据存储的单元测试代码相关的SO答案:

我会尝试整合这些解决方案。

序言

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

此ENV可以是低占用空间并且完全在内存中运行(resource 1)(resource 2),但不一定需要与生产ENV相同的性能特征。 (如果您想进行性能测试,则应该在与CI无关的单独环境中处理。)

设置

  • 专门为CI安装mongod服务。如果需要关注repl设置和/或分片(例如写入问题,不使用$isolated等),可以通过在同一台机器上运行多个mongod实例(1个配置,2个用于shard + repl的数据)和一个mongos实例来模拟集群环境,并使用一些init.d脚本/调整或像docker这样的东西。
  • 在您的应用程序中使用特定于环境的配置(通过.json文件嵌入,或者在/ etc,/ home / user / .your-app或类似地方)。您的应用程序可以根据node environment variable like NODE_ENV=int加载这些内容。在这些配置中,数据库连接字符串会有所不同如果您使用特定于env的配置,请开始这样做以抽象应用程序运行时设置(即"本地"," dev&#34 ;," int"," pre"," prod"等)。 我可以根据要求提供样品。
  • 在您的应用程序/测试套件中包含面向测试的工具。如其中一个链接问题所述,MongoDB的Node.js驱动程序支持一些帮助程序库:mongodb-fixtures and node-database-cleaner 。 Fixtures为测试提供了一个工作且一致的数据集:将它们视为引导程序。

建立/测试

  1. 使用node-database-cleaner
  2. 等内容清理关联的数据库
  3. 借助mongodb-fixtures
  4. 将您的灯具填充到现在空的数据库中
  5. 执行构建和测试。
  6. 重复。
  7. 另一方面......

    如果您仍然认为运行MongoDB的是正确的方法(and you wouldn't be the only one),那么使用ORM从驱动程序中抽象数据存储调用是最好的选择(对于整个应用程序,而不仅仅是测试)。例如,model claims to be database agnostic之类的东西,虽然我从未使用它。使用这种方法,您仍然需要 fixtures env配置,但是您不需要安装MongoDB。这里需要注意的是,您选择了ORM的摆布。

答案 1 :(得分:-2)

您可以尝试tingodb

  

TingoDB是一个嵌入式JavaScript进程内文件系统或内存数据库向上兼容API级别的MongoDB。