2014-02-10 47 views
2

我正在尋找使用摩卡或sinon測試mysql查詢的最佳實踐。我想測試非常基本的數據庫查詢,如保存:解耦查詢與測試的最佳實踐

User.prototype.save = function(cb) { 

var query = 'INSERT INTO user (name, email, password, img, description)' 
    + 'values (?, ?, ?, ?, ?)'; 

var params = [this.name, this.email, this.pass, this.img, this.description]; 

db.query(query, 
    params, 
    function(err, rows) { 
     if (err) return cb(err); 
     cb(rows.insertId); 
    } 
); 
}; 

我相信我要讓數據庫,並使用該對象我的數據庫對象,而不是模擬,但我也想測試分離來自應用程序邏輯的邏輯。

我試過變化沿

describe('User', function() { 
before(function() { 
    mock = sinon.mock(require('../middleware/db')); 
}) 
describe('.save()', function() { 
    var uid; 
    it('should run save on a user', function() { 
     var user = new User ({ 
      name: 'Test Case 1', 
      email: '[email protected]', 
      pass: 'pass', 
      img: 'path/to/img.jpg' 
     }); 
     user.save(function(id) { 
      id.should.be.ok; 
      var uid = id; 
     }); 
    }) 
    it('should save the user', function() { 
     var ret = User.find(uid); 
     ret.should.be.ok; 
     ret.should.have.property('description'); 
     ret.name.should.equal('Test Case 1'); 
     ret.email.should.equal('[email protected]'); 
    }) 
}) 

行會是怎樣測試這種類型的函數的最佳實踐?

感謝

回答

0

與數據庫中的實際作用不應該被單元測試來處理,但通過端到端的測試。使用數據庫進行端到端測試的最佳做法是定義數據庫狀態,在每次測試之前將數據庫狀態加載到數據庫中。

在單元測試方面,由於此方法是調用外部模塊的包裝,因此將單元測試推遲到第三方可能就足夠了。