2016-02-12 67 views
-1

我已經編寫了一個Web服務,在執行一些驗證和數據操作(普通業務邏輯)之後,確實會使用外部Web服務。我需要爲此編寫單元測試,並且還需要編寫代碼覆蓋率報告。網上有很多建議,摩卡是最重要的。但在所有可用的示例中,都會發生實際的數據庫調用或外部服務調用我的要求是不要有實際的外部服務調用,而只是模擬調用(我們如何在Java中使用EasyMock)。任何幫助將不勝感激。是否有可能在節點js中創建數據庫調用或外部服務調用的模擬?Node.js單元測試 - 使用摩卡創建模擬層

+0

對於mongodb,有一個模塊https://www.npmjs.com/package/mongo-mock for test – zangw

回答

0

您可以使用Sinon和Mocha提供存根或監聽電話。同時寫你的代碼來幫助嘲笑也很重要。例如,不要假設Web組件中存在數據庫處理程序,並通過構造函數將其傳入。這種方式很容易進行測試,以用您自己的「模擬」版本替換數據庫。

作爲一個例子 - 這裏是我的一堆測試之一的開始,我將一個模擬連接池實例化爲我的數據庫處理程序並將其傳遞到測試中。我實際上也在嘲笑Web服務器,只是測試API。

(function(){ 
    'use strict'; 

    const DBHOST = 'dummy'; 
    const DBNAME = 'dummy'; 


    const expect = require('chai').expect; 
    const sinon = require('sinon'); 


    const mock = require('../mock/server'); 
    const DB = require('../database'); 
    const Logging = require('../log'); 
    Logging.debug(true); //set to log debug message 
    const logger = Logging.logger; 
    const poolPromise = mock.getPool(); 
    const db = new DB(mock.Pool,DBNAME,logger); 

    const API = require('../api'); 
    const api = new API(mock.server,db,logger); 




    describe('API tests',function() { 
    let sandbox, testConnection; 
    beforeEach(function(){ 
     sandbox = sinon.sandbox.create(); 
     testConnection = new mock.Connection(); 
     return poolPromise.then(pool => { 
     pool.getConnection().then(cb => { 
      cb(null,testConnection); 
     }); 
     }); 

    }); 
    afterEach(function(){ 
     sandbox.restore(); 
    }); 

    describe('/logon',function() { 
     let params; 
     describe('Admin', function() { 
     beforeEach(function() { 
      params = {name: 'Admin', password: 'abcde'}; 
     }) 
     it('Performs logon if username is "Admin" and password is good', function(done) { 
      mock.server.emit('/logon', params, (status,user) => { 
      expect(status).to.be.true; 
      expect(user).to.be.an('object'); 
      expect(user.uid).to.be.equal(0); 
      expect(user.name).to.be.equal('Super User'); 
      expect(user.keys).to.be.equal('A'); 
      done(); 
      }); 
      testConnection.next.then(value => { 
      let request = value.request; 
      expect(value.name).to.equal('execSql'); 
      expect(request.sqlTextOrProcedure).to.equal('SELECT passwordsalt FROM Admin WHERE AdminID = 0'); 
      request.emit('row', mock.makeRow('passwordsalt',['salt'])); 
      request.callback(null,1); 
      return testConnection.next; 
      }).then(value => { 
      let request = value.request 
      expect(value.name).to.equal('callProcedure'); 
      expect(request.sqlTextOrProcedure).to.equal('CheckPassword'); 
      request.emit('row',mock.makeRow('a',[1])); 
      request.callback(null,0); 
      }); 
     });