2015-12-19 50 views
0

我有這個文件包含下面的代碼,這是我的API的數據庫層。它在外部依賴於SQL Server來獲取數據。如何使用mocha和chai單元測試此node.js模塊?

var sql = require('mssql'); 
var async = require('async'); 

module.exports = { 
    getDetails: function(number, callback) { 

    async.parallel({ 
      general: function(callback) { 
       getGeneral(number, callback); 
      }, 
      preferences: function(callback) { 
       getPref(number, callback); 
      } 
     }, 
     function(err, results) { 
      if (err) { 
       logger.error(err); 
       throw err; 
      } 
      callback(results); 
     }); 
} 
}; 

function getGeneral(number, callback) { 
    var mainconnection = new sql.Connection(dbCredentials[1].generalDBConfig, function(err) { 
     var request = new sql.Request(mainconnection); 
     request.input('number', sql.BigInt, number); 
     request.execute('[number].[genral_get]', function(err, recordsets) { 
      if (err) { 
       logger.error(err); 
      } 
      var gen = {}; 
      var spResult = recordsets[0]; 
      if (spResult[0] != null) { 
       spResult.forEach(function(record) { 
        var test = {}; 
        gen[record.genCode] = record.genValue; 
       }); 

       callback(null, gen); 
      } else { 
       callback(null, null); 
      } 

     }); 

    }); 
} 

function getPref(number, callback) { 
    var mainconnection = new sql.Connection(dbCredentials[0].prefDBConfig, function(err) { 
     var request = new sql.Request(mainconnection); 
     request.input('number', sql.BigInt, number); 
     request.execute('[number].[pref_get]', function(err, recordsets) { 
      if (err) { 
       logger.error(err); 
      } 
      var spResult = recordsets[0]; 
      if (spResult[0] != null) { 
       callback(null, spResult[0]); 
      } else { 
       callback(null, null); 
      } 

     }); 

    }); 
} 

數據庫層的回該JSON格式數據:

{ 
         "general": { 
          "number": "72720604" 
          "title": "Mr ", 
          "buildingNameNumber": null, 
          "subBuildingName": null, 
          "streetName": null, 
          "postalTown": null, 
          "county": null 
         }, 
         "pref": { 
          "UseAccessibilitySite": "00000", 
          "IntroductorySource": "75" 
         } 
        }; 

由於我是新來的單元測試,我不知道如何開始對編寫單元測試該模塊,即使選擇摩卡與柴作爲我的單元測試框架。任何種類的建議或幫助表示讚賞...

回答

1

問題是:你想在這個代碼中測試什麼?

我假設答案大致是「我想在我的測試套件中調用getDetails()並驗證它的行爲是否正確」。

當然,你不想在你的測試套件中創建一個完整的MSSQL服務器。相反,它更容易存根數據庫。

我已經取得了巨大成功的嘲笑,殘留和間諜模塊是sinon.js。對於您的代碼,您需要存根幾件事:

  • 存根sql.Connection()返回一個存根連接對象。
  • 存根sql.Request()返回一個存根對象,該存根對象具有方法inputexecute
  • 存根sql.BigInt()驗證它是否正確調用。

然後,對於存根request對象,您需要:

  • 驗證.input()正確調用。
  • 確保execute返回您選擇的記錄。

完成測試getDetails()函數將需要很多設置工作。您可能還對rewire模塊感興趣,該模塊可讓您直接測試getGeneral()getPref(),而無需將它們添加到module.exports。最後,將這些代碼重構爲更小的代碼也會有很大的幫助。例如,如果你可以做這樣的事情:

// This is your own db module, which takes care of connecting 
// to the database for you. 
var db = require('./db'); 

function getGeneral(number, callback) { 
    var request = db.createRequest(); 
    // The rest of the function 
} 

然後,它會更容易使用sinon創建不正是你想要它做一個假的請求對象。

+0

我不是殘存整個MSSQL服務器,而是存根/模擬來測試這個模塊或數據庫層所需的東西。可以請給我看一些模塊的示例測試用例,如果它對你有用,那麼它可能會給你一些kickstart。 – Prajwal

+0

任何答案,因爲我嘲笑數據庫! – Prajwal

+0

以我的經驗,sinon.js文檔非常好。例如,你可以使用'存根。返回({input:inputFunction,execute:executeFunction})'返回一個虛假的請求對象。此外,您可以在使用sinon的代碼的博客文章中找到許多示例。 –

相關問題