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) {}); });