如何unit testing连接到mongo的方法,而不实际连接到mongo?

我试图编写一个testing来testing一个连接到mongo的方法,但是我实际上并不想让mongo运行,并且实际上build立了连接来让我的testing成功通过。

这是我当前的testing,当我的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; } 

有几个与unit testing代码相关的SO答案,它们使用MongoDB作为数据存储:

  • 嘲笑node.js中的数据库?
  • 模拟/testingMongodb数据库Node.js
  • 在运行集成testing时embeddedMongoDB
  • 类似: 具有在线function的unit testing类

我将尝试巩固这些解决scheme。

前言

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

这个ENV可能占用空间小,在内存( 资源1 )( 资源2 )中完全运行,但不一定需要与生产ENV相同的性能特征。 (如果要进行性能testing,则应该在与CI无关的单独环境中进行处理。)

build立

  • 安装专门用于CI的mongod服务。 如果repl集合和/或分片是关注的(例如写关注,不使用$isolated等),可以通过运行多个mongod实例(1个configuration,2×2数据用于shard + repl)来模仿集群环境,一个mongos实例在同一台机器上有一些init.d脚本/调整或像泊坞窗。
  • 在您的应用程序中使用特定环境的configuration (通过.json文件embedded,或在/ etc / / home / user / .your-app或类似位置)。 您的应用程序可以根据节点环境variables(如NODE_ENV=int加载这些variables 。 在这些configuration中你的db连接string将会不同。 如果你没有使用特定于env的configuration,那么开始这样做来抽象应用程序运行时设置(即“local”,“dev”,“int”,“pre”,“prod”等)。 我可以根据要求提供样品。
  • 在您的应用程序/testing套件中包含面向testing的固件。 正如其中一个链接问题所述,MongoDB的Node.js驱动程序支持一些辅助程序库: mongodb-fixturesnode-database-cleaner 。 灯具提供了一个工作和一致的数据集进行testing:把他们想象成一个引导。

构build/testing

  1. 使用类似于node-database-cleaner东西来清理关联的数据库。
  2. mongodb-fixtures的帮助下,将你的灯具填充到现在空的数据库中。
  3. 执行你的构build和testing。
  4. 重复。

另一方面…

如果您仍然决定运行MongoDB是正确的方法( 并且您不是唯一的方法 ),那么使用ORM从驱动程序中抽取数据存储库调用是最好的select(对于整个应用程序而言,不仅仅是testing) 。 例如,像model声明是数据库不可知的 ,虽然我从来没有使用它。 利用这种方法,你仍然需要fixturesenvconfiguration ,但是你不需要安装MongoDB。 这里的警告是,你在你select的ORM的摆布。

你可以试试tingodb 。

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