检查是否正在使用给定的中间件

rba*_*ado 3 middleware mocha.js express

我尝试了官方文档,但无法找到如何检查当前应用程序是否正在使用给定的中间件(即morgan)。由于我的中间件配置取决于开发/生产情况,因此我想在我的Mocha测试中检查它们是否处于活动状态

Ada*_*son 5

Express不允许这样做。

最好的办法是看一下app._router.stack,特别是看一下函数引用,或者,如果不可能的话,看一下函数名:

function middlewareExists(app, name) {
    return !!app._router.stack.filter(function (layer) { 
        return layer && layer.handle && layer.handle.name === name; 
    }).length;
}
Run Code Online (Sandbox Code Playgroud)

因此,我建议使用稍微不同的方法。如果可以获取您希望应用程序访问的中间件功能的引用,则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);
Run Code Online (Sandbox Code Playgroud)

希望这是说明性的。关键是要注入事物,这样您就不必在实际的Express应用程序本身上进行断言,您只需注入模拟对象并根据这些对象进行断言即可。