2014-11-04 80 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。