unit testing快速路由调用控制器方法?

我看到一些类似的问题 ,但我的设置稍有不同,我无法找出一个好方法来testing这个。

我试图testing,我的快速应用程序路线是针对正确的控制器方法。

例如 –

//server.js, base application var express = require("express"); var app = express(); require("./routes.js")(app); ... //routes.js var menuController = require("./controllers/menu.js"); module.exports = function(expressApp) { expressApp.get('/menu', menuController.getMenu); }; ... //test file var express = require('express') , menuController = require("../../controllers/menu.js") , chai = require('chai') , should = chai.should() , sinon = require('sinon') , sinonChai = require("sinon-chai"); chai.use(sinonChai); var app = express(); require("../../routes/routes.js")(app); describe('routes.js', function(){ it('/menu should call menuController.getMenu route', function(){ var spy = sinon.spy(menuController, 'getMenu'); app.get('/menu', spy); spy.should.have.been.called; //fails, never called }); }); 

我怎样才能检查,看看调用app.get('/ menu',..),调用menuController的callback? 或者我应该以某种方式重新调整应用程序(我看到一些其他的方式来configuration路由)?

而不是这样做,我会build议检查从/menu回来的响应代码,并检查它所要求的响应本身或包含已知的响应。

这不会是真正的unit testing,但你可以这样做:

像这样使用dependency injection:

 function bootstrapRouterFactoryMethod(bootstrapController) { var router = express.Router(); router.route('/').post(bootstrapController.bootstrap); return router; }; module.exports = bootstrapRouterFactoryMethod; 

然后通过假作为bootstrapController并validation是否调用引导方法。

 var request = require('supertest'); ... it('calls bootstrapController #bootstrap', function (done) { var bootstrapControllerFake = { bootstrap: function(req, res) { done(); } }; var bootstrapRouter = bootstrapRouterFactoryMethod(bootstrapControllerFake); app.use(bootstrapRouter); request(app).post('/').end(function (err, res) {}); });