是否可以直接从具有“假”请求的代码调用Express Router?

切线这个问题 ,我想知道是否有一种方法可以触发Express Router,而不需要通过HTTP?

路由器有一个名为handle的“private”方法 ,它接受一个请求,一个响应和一个callback。 您可以看看Express对其路由器的testing。 一个例子是:

 it('should support .use of other routers', function(done){ var router = new Router(); var another = new Router(); another.get('/bar', function(req, res){ res.end(); }); router.use('/foo', another); router.handle({ url: '/foo/bar', method: 'GET' }, { end: done }); }); 

Express团队使用SuperTest在路由器上执行集成testing。 这是我的理解,SuperTest仍然使用networking,但他们处理所有这一切,因此它的行为好像testing都在内存中。 SuperTest似乎被广泛使用和一个可接受的方式来testing你的路线。

顺便说一句,你没有说你正在试图testing什么,但是如果你的目标是testing一些路线,SuperTest的替代可能是将你的路线中的逻辑提取到一个单独的模块,可以独立于Expresstesting。

更改:

 routes | -- index.js 

至:

 routes | -- index.js | controllers | -- myCustomController.js 

然后testing可以简单地定位到myCustomController.js并注入任何必要的依赖关系。

通过转到Express的来源,我能够发现确实有一个API,就像我希望的一样简单。 它在express.Router的testing中被logging。

 /** * @param {express.Router} router */ function dispatchToRouter(router, url, callback) { var request = { url : url, method : 'GET' }; // stub a Response object with a (relevant) subset of the needed // methods, such as .json(), .status(), .send(), .end(), ... var response = { json : function(results) { callback(results); } }; router.handle(request, response, function(err) { console.log('These errors happened during processing: ', err); }); } 

但是……不利的一面是,它正是它为什么没有文档的原因:它是Router.prototype的一个私有函数:

 /** * Dispatch a req, res into the router. * @private */ proto.handle = function handle(req, res, out) { var self = this; ... } 

所以依靠这个代码并不是世界上最安全的东西。

您可以使用run-middleware模块。 你创build一个快速的应用程序,然后你可以使用你的参数调用应用程序

 it('should support .use of other routers', function(done){ var app=require('express')() app.get('/bar', function(req, res){ res.status(200).end(); }); app.runMiddleware('/bar',{options},function(responseCode,body,headers){ console.log(responseCode) // Should return 200 done() }) }); 

更多信息:

  • Github & NPM中的模块页面;
  • 使用运行中间件模块的例子

披露:我是这个模块的维护者和第一个开发者。