2014-11-04 62 views
2

我创建了一个Express.js库,该库使用官方Node.js驱动程序进行Mongodb操作。模拟未能访问Mongodb

我目前在编写单元测试的过程中,我想模拟故障来访问数据库,以确保:

  • 库承认失败的情况下(处理错误)
  • 使正确的错误回调并触发适当的事件。

我希望测试运行跨平台,最好不必关闭或启动具有特殊参数的数据库。

纵观reference的命令时,sleep命令似乎做几乎正是我想要的,但等待时间,以秒长的很漂亮,再加上它标记为仅供内部使用,你需要触发与数据库它是一个特殊的参数。 forceerror命令看起来好像是另一个好的命令,但它又被列为仅供内部使用,说明含糊不清。

我想知道是否有任何建议(最好不要过度hackish)这样做的方式。

回答

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中的测试逻辑崩溃,您可以手动执行恢复的MongoDB进程的外壳:

kill -CONT PID 

w ^这里PID是MongoDB进程的进程ID。