如何对连接到Mongo的方法进行单元测试,而不实际连接到Mongo?
如何对连接到Mongo的方法进行单元测试,而不实际连接到Mongo?
我正在尝试编写一个测试来测试连接到mongo的方法,但实际上我并不想要求mongo运行并且实际上连接到它才能使我的测试成功通过。
以下是我的当前测试,当我的mongo守护进程正在运行时,它是成功的。
描述('使用有效的mongo字符串参数', function() {
it('应该返回一个被拒绝的promise', function(done) {
var con = mongoFactory.getConnection('mongodb://localhost:27017');
expect(con).to.be.fulfilled;
done();
});
});
mongoFactory.getConnection代码:
getConnection: function getConnection(connectionString) {
// 在这里执行操作
// 初始化连接
MongoClient.connect(connectionString, function(err, database) {
if (err) {
def.reject(err);
}
def.resolve(database);
});
return def.promise;
}
如何对连接到Mongo的方法进行单元测试,而不实际连接到Mongo?
问题原因:
1. MongoDB的查询语言复杂,为了确保查询运行正常并且应用程序对结果作出正确响应,应该在执行测试时保持MongoDB运行。
2. 但是,不应该在生产系统上运行测试,而是在集成环境之外的辅助系统上运行测试。
3. 在CI软件的同一台机器上或者相对靠近CI软件的机器上设置一个低资源占用的环境即可。
解决方法:
1. 为CI安装一个专用的mongod服务。如果涉及到repl sets和sharding等问题,可以通过在同一台机器上运行多个mongod实例和一个mongos实例来模拟群集环境。
2. 在应用程序中使用特定于环境的配置,可以通过在.json文件中嵌入配置或者在/etc、/home/user/.your-app等位置存放配置文件,并根据NODE_ENV变量加载不同的配置。
3. 在应用程序/测试套件中包含测试相关的fixtures。MongoDB的Node.js驱动程序支持一些辅助库,如mongodb-fixtures和node-database-cleaner,fixtures提供了一个可用于测试的工作和一致的数据集。
构建/测试步骤:
1. 使用node-database-cleaner清空相关的数据库。
2. 使用mongodb-fixtures将fixtures填充到空的数据库中。
3. 执行构建和测试。
4. 重复以上步骤。
另一方面,如果决定不运行MongoDB,则可以通过使用ORM将数据存储调用与驱动程序进行抽象来达到目标。通过使用ORM,仍然需要fixtures和环境配置,但不需要安装MongoDB。但是,这种方法的缺点是受所选择的ORM的限制。
问题的原因是,需要对一个连接到MongoDB的方法进行单元测试,但是又不想实际连接到MongoDB数据库。
解决方法是使用tingodb。tingodb是一个嵌入式JavaScript数据库,与MongoDB在API层面上兼容。它支持MongoDB的大部分常用功能,因此可以用来替代MongoDB进行单元测试。
下面是使用tingodb进行单元测试的示例代码:
const assert = require('assert'); const { Db } = require('tingodb')(); describe('MyMethod', () => { it('should connect to MongoDB', () => { // Create a TingoDB instance const db = new Db('/path/to/db', {}); // Call the method that connects to MongoDB const result = myMethod(db); // Perform assertions on the result assert.equal(result, expected); }); }); function myMethod(db) { // Code that connects to MongoDB and performs some operations // ... return result; }
在这个示例中,我们使用tingodb的Db类创建了一个TingoDB实例,并将其传递给需要测试的方法myMethod。在myMethod中,我们可以模拟连接到MongoDB并执行一些操作。最后,我们可以使用assert来断言方法的返回值是否符合预期。
通过使用tingodb,我们可以在不实际连接到MongoDB的情况下对方法进行单元测试,从而提高测试效率和便捷性。
希望这篇文章能帮助你解决问题!