是否可以直接从具有“假”请求的代码调用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中的模块页面;
- 使用运行中间件模块的例子
披露:我是这个模块的维护者和第一个开发者。