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

 飞龙在天2602911735 发布于 2022-12-25 07:07

我正在尝试编写测试来测试连接到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;
    }

zamnuts.. 37

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

在node.js中模拟数据库?

模拟/测试Mongodb数据库Node.js

运行集成测试时嵌入式MongoDB

类似:具有在线功能的单元测试类

我会尝试巩固这些解决方案.

前言

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

这个ENV可以是低占用空间并且完全在内存(资源1)(资源2)中运行,但不一定需要与生产ENV相同的性能特征.(如果您想进行性能测试,那么无论如何都应该在与CI不同的环境中处理.)

建立

mongod专门为CI 安装服务.如果关注repl set和/或sharding(例如写入问题,不使用$isolated等),则可以通过运行多个mongod实例(1个配置,2个用于shard + repl的数据)和一个mongos实例来模拟集群环境.同一台机器有一些init.d脚本/调整或像docker这样的东西.

在您的应用程序中使用特定环境的配置(通过.json文件嵌入,或者在/ etc,/ home/user/.your-app或类似地方).您的应用程序可以根据节点环境变量NODE_ENV=int加载这些.在这些配置中,数据库连接字符串会有所不同 如果您没有使用特定于env的配置,请开始这样做以抽象应用程序运行时设置(即"本地","dev","int","pre","prod"等).我可以根据要求提供样品.

在您的应用程序/测试套件中包含面向测试的夹具.正如其中一个链接问题所述,MongoDB的Node.js驱动程序支持一些帮助程序库:mongodb-fixturesnode-database-cleaner.Fixtures为测试提供了一个工作且一致的数据集:将它们视为引导程序.

构建/测试

    使用类似的东西清理相关的数据库node-database-cleaner.

    借助于将您的灯具填充到现在空的数据库中mongodb-fixtures.

    执行构建和测试.

    重复.

另一方面...

如果您仍然认为没有运行MongoDB是正确的方法(并且您不会是唯一的方法),那么使用ORM从驱动程序中抽象数据存储调用是最好的选择(对于整个应用程序,而不仅仅是测试) .例如,虽然我从未使用它,但model声称与数据库无关.使用这种方法,您仍然需要fixturesenv配置,但是您不需要安装MongoDB.这里需要注意的是,您将受到您选择的ORM的支配.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有