模拟无法访问Mongodb

时间:2014-11-04 19:51:30

标签: node.js mongodb

我创建了一个Express.js库,它使用官方的Node.js驱动程序进行Mongodb操作。

我目前正在编写单元测试,我想模拟访问数据库的失败以确保:

  • 图书馆确认失败案例(处理错误)
  • 进行正确的错误回调并触发正确的事件。

我希望测试能够跨平台运行,最好不必关闭或使用特殊参数启动数据库。

查看reference命令,sleep命令似乎几乎完全符合我的要求,但等待的时间以秒为单位,加上它仅标记为仅供内部使用,您需要使用特殊参数触发数据库才能使其正常工作。 forceerror命令看起来像另一个好的命令,但同样,它仅列为内部使用,描述至少可以说是含糊不清。

我想知道是否有任何推荐(最好不要过于强硬)的方式。

1 个答案:

答案 0 :(得分:1)

在这里,它需要执行此脚本的节点进程的超级用户权限才能将信号发送到MongoDB进程而不会产生它,但它是迄今为止我发现的模拟无响应的最佳权限:

var MongoDB = require('mongodb');

MongoDB.MongoClient.connect("mongodb://localhost:27017/SomeDB", {'server': {'socketOptions': {'connectTimeoutMS': 50, 'socketTimeoutMS': 50}}}, function(Err, DB) {
    if(Err)
    {
        console.log(Err);
    }
    else
    {
        DB.command({'serverStatus': 1}, function(Err, Result) {
            if(Err)
            {
                console.log(Err)
            }
            else
            {
                process.kill(Result.pid, 'SIGSTOP');
                //Put testing logic to test unresponsiveness
                process.kill(Result.pid, 'SIGCONT');
                DB.close();
            }
        });
    }
});

编辑:

如果您的测试逻辑在Linux上崩溃,您可以通过执行以下命令在shell上手动恢复MongoDB进程:

kill -CONT PID

其中PID是MongoDB进程的进程ID。