如何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-fixtures
和node-database-cleaner
。 灯具提供了一个工作和一致的数据集进行testing:把他们想象成一个引导。
构build/testing
- 使用类似于
node-database-cleaner
东西来清理关联的数据库。 - 在
mongodb-fixtures
的帮助下,将你的灯具填充到现在空的数据库中。 - 执行你的构build和testing。
- 重复。
另一方面…
如果您仍然决定不运行MongoDB是正确的方法( 并且您不是唯一的方法 ),那么使用ORM从驱动程序中抽取数据存储库调用是最好的select(对于整个应用程序而言,不仅仅是testing) 。 例如,像model
声明是数据库不可知的 ,虽然我从来没有使用它。 利用这种方法,你仍然需要fixtures和envconfiguration ,但是你不需要安装MongoDB。 这里的警告是,你在你select的ORM的摆布。
你可以试试tingodb 。
TingoDB是一个embedded式JavaScript进程内文件系统或内存数据库,向上兼容MongoDB在API级别。