2012-10-07 65 views
0

當我嘗試遵循TDD的開發方式時,我仍然很難找出如何在JavaScript中模擬某些東西。我習慣用Mockito和Spring嘲笑Java(例如,注入一個mongo mock而不是一個真正的mongo實例),但是我如何在JavaScript中處理這個問題?在node.js應用程序中嘲弄mongoskin

讓我做一個簡單的例子淋巴結的RESTify的Node.js:

var mongoskin = require('mongoskin'); 
var restify = require('restify'); 

// ############################### 
// ## Global Configuration 
// ############################### 

var mongoURL = process.env.MONGOHQ_URL || "mongodb://localhost/test"; 
var serverPort = process.env.PORT || 5000; 

// ############################### 
// ## Basic Setup 
// ############################### 
var server = restify.createServer({ 
    name: 'test' 
}); 

server.use(connect.logger()); 
server.use(restify.acceptParser(server.acceptable)); 
server.use(restify.bodyParser()); 

var db = mongoskin.db(mongoURL); 

// ############################### 
// ## API 
// ############################### 

server.get('/api/v1/projects', function (req, res, next) { 
    db.collection('projects').find().toArray(function (error, projects) { 
     if (error) { 
      return next(new restify.InternalError()); 
     } 

     res.json(200, projects); 

     return next(); 
    }); 
}); 

server.get('/api/v1/projects/:projectId', function (req, res, next) { 
    if (req.params.projectId === null) { 
     return next(new restify.InvalidArgumentError('ProjectId must not be null or empty.')) 
    } 

    db.collection('projects').findById(req.params.projectId, function (error, project) { 
     if (error) { 
      return next(new restify.InternalError()); 
     } 

     res.json(200, project); 

     return next(); 
    }); 
}); 

// ############################### 
// ## Main Server Initialization 
// ############################### 

server.listen(serverPort, function() { 
    console.log('%s listening at %s', server.name, server.url); 
}); 

我想現在有一個測試JavaScript文件,在那裏我可以測試這兩個「得到」的方法。此外,我想嘲笑mongoskin實例('db'),以便我可以使用例如JSMockito窺探並假裝一些行爲。

現在最好的方法是什麼?有人可以發佈一個小例子文件嗎?我該如何管理注入模擬數據庫實例?

感謝您的幫助!

蒂埃裏

回答

0

優先的大量那裏爲一般容易嘲諷一個REST API: https://github.com/flatiron/nock

與嘲諷數據庫的問題是,它通常有一個極其複雜和多毛的API。有兩個簡單的(因此在嚴格的單元測試意義上不太正確)方法來做到這一點。

一個是讓'模型'包裝你的實體訪問,而不是直接去數據庫驅動。然後你可以輕鬆地嘲笑你的模型apis。這很好,但如果你只是在做一些基本的數據庫操作,而且你不需要大型的模型抽象,那麼有點煩人。

第二種方法是在測試過程中使用一些測試數據創建一個數據庫並與之連接。這有點「功能測試」,但在我的經驗中也更實用。