我正在尝试编写测试以测试连接到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;
}
答案 0 :(得分:33)
有一些与使用MongoDB作为数据存储的单元测试代码相关的SO答案:
我会尝试整合这些解决方案。
首先,您应该在执行测试时希望MongoDB正在运行。 MongoDB的查询语言很复杂,因此需要针对稳定的MongoDB实例运行合法查询,以确保您的查询按计划运行,并且您的应用程序正在对结果做出正确响应。但是,考虑到这一点,您应该从不对生产系统运行测试,而是将外围系统运行到集成环境中。这可以与CI软件在同一台机器上,或者只是相对接近它(就流程而言,不一定是网络或地理位置)。
此ENV可以是低占用空间并且完全在内存中运行(resource 1)(resource 2),但不一定需要与生产ENV相同的性能特征。 (如果您想进行性能测试,则应该在与CI无关的单独环境中处理。)
mongod
服务。如果需要关注repl设置和/或分片(例如写入问题,不使用$isolated
等),可以通过在同一台机器上运行多个mongod
实例(1个配置,2个用于shard + repl的数据)和一个mongos
实例来模拟集群环境,并使用一些init.d脚本/调整或像docker这样的东西。NODE_ENV=int
加载这些内容。在这些配置中,数据库连接字符串会有所不同如果您不使用特定于env的配置,请开始这样做以抽象应用程序运行时设置(即"本地"," dev&#34 ;," int"," pre"," prod"等)。 我可以根据要求提供样品。 mongodb-fixtures
and node-database-cleaner
。 Fixtures为测试提供了一个工作且一致的数据集:将它们视为引导程序。node-database-cleaner
。mongodb-fixtures
。如果您仍然认为运行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。