1

我在测试 middelware 使用时遇到了一些问题,需要您的帮助!

配置我的应用程序:

var express         = require('express');
var path            = require('path');
var errorHandler    = require('errorhandler');
var routes          = require('./routes');
var morgan          = require('morgan');

module.exports = function(app) {
    app.set('port', process.env.PORT || 3300);
    app.use(morgan('dev'));
    app.use('/public', express.static(path.join(__dirname, '../public')));
    routes.initialize(app);
    if ('development' === app.get('env')) {
        app.use(errorHandler());
    }
    return app;
};

我想用测试来覆盖它(使用 mocha 和 sinon-chai 用于存根和间谍)。因此,当我为摩根的使用编写测试用例时:

app.use(morgan('dev'));

我将 app.use() 设置为间谍,并希望它以 morgan('dev') 作为唯一参数来调用。

var app;
var express     = require('express');
var configure   = require('../../../server/configure');
var morgan      = require('morgan');

describe('Server configurations', function() {
     it('should use morgan', function() {
        app = {
            get: sinon.spy(),
            set: sinon.spy(),
            use: sinon.spy()
        };
        configure(app);
        expect(app.use).to.be.calledWith(morgan('dev'));
     });

});

我收到这样的错误:

AssertionError: expected use to have been called with arguments function logger() {}
    use(function () {})
    use(function logger() {})
    use(/public, function serveStatic() {})

想不通为什么。在使中间件使用功能成为间谍时,有什么需要关注的吗?

提前致谢。

4

1 回答 1

1

我找到了一种检查中间件是否已连接的方法。你应该在app._router.stack. 我为此编写了一个函数,它看起来像:

function isMiddlewareSet(app, middlewareName) {
    var _return = false;
    app._router.stack.filter(function(layer) {
        if (layer.handle.name == middlewareName) {
            _return = true;
        }
    });
    return _return;
}

然后我在我的测试中使用它。

    beforeEach(function() {
        app = express();
        configure(app);
    });

    it('should use "errorHandler" middleware in dev env', function() {
        app.get = sinon.stub().returns('development');
        expect(isMiddlewareSet(app, 'errorHandler')).to.equal(true);
    });

    it('should use "morgan" middleware logger', function() {
        expect(isMiddlewareSet(app, 'logger')).to.equal(true);
    });

    it('should use "bodyParser.json" middleware', function() {
        expect(isMiddlewareSet(app, 'json')).to.equal(true);
    });
...

但我想这不是最好的解决方案。

于 2015-08-13T21:23:09.467 回答