【发布时间】:2014-10-10 16:46:09
【问题描述】:
我尝试了官方文档,但我找不到如何检查当前应用程序是否正在使用给定的中间件(即 morgan)。由于我的中间件配置取决于开发/生产情况,我想检查它们在我的 mocha 测试中是否处于活动状态
【问题讨论】:
标签: express mocha.js middleware
我尝试了官方文档,但我找不到如何检查当前应用程序是否正在使用给定的中间件(即 morgan)。由于我的中间件配置取决于开发/生产情况,我想检查它们在我的 mocha 测试中是否处于活动状态
【问题讨论】:
标签: express mocha.js middleware
Express 不允许这样做非常干净。
您可以做的最好的事情是查看app._router.stack,特别是函数引用,或者如果这不可能,函数的名称:
function middlewareExists(app, name) {
return !!app._router.stack.filter(function (layer) {
return layer && layer.handle && layer.handle.name === name;
}).length;
}
所以,我推荐一种稍微不同的方法。如果您可以获得对您希望应用程序use 的中间件函数的引用,您可以存根use 并断言传递的内容。
(伪代码)
// server.js
helperModule.registerMiddleware(app, 'production');
// helperModule.js
var someMiddleware = require('./someMiddleware');
module.exports = exports = {
registerMiddleware: function (app, env) {
if (env === 'production')
app.use(someMiddleware);
}
};
// helperModule.test.js
var helperModule = require('./helperModule');
var someMiddleware = require('./someMiddleware');
var app = { use: sinon.stub() };
helperModule.registerMiddleware(app, 'production');
expect(app.use).to.have.been.calledWith(someMiddleware);
希望这有点说明问题。关键是要注入一些东西,这样您就不需要在实际的 express 应用程序本身上进行断言,您只需注入模拟对象并根据这些对象进行断言。
【讨论】:
middlewareExists如果还没有添加到应用程序中的中间件会抛出异常。在函数顶部插入一行 if (!app._router) { return false } 可以防止出现此问题。