我正在尝试编写测试来测试连接到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-fixtures
和node-database-cleaner
.Fixtures为测试提供了一个工作且一致的数据集:将它们视为引导程序.
构建/测试
使用类似的东西清理相关的数据库node-database-cleaner
.
借助于将您的灯具填充到现在空的数据库中mongodb-fixtures
.
执行构建和测试.
重复.
如果您仍然认为没有运行MongoDB是正确的方法(并且您不会是唯一的方法),那么使用ORM从驱动程序中抽象数据存储调用是最好的选择(对于整个应用程序,而不仅仅是测试) .例如,虽然我从未使用它,但model
声称与数据库无关.使用这种方法,您仍然需要fixtures和env配置,但是您不需要安装MongoDB.这里需要注意的是,您将受到您选择的ORM的支配.