使用 mocha 和 sinon-chai 测试 express 中间件的使用
Testing express middleware usage with mocha and sinon-chai
我在测试中间件使用时遇到了一些问题,需要你的帮助!
配置我的应用程序:
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 作为存根和间谍)。所以当我为 morgan 用法编写测试用例时:
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() {})
想不通为什么。将中间件用作间谍时,有什么需要注意的地方吗?
提前致谢。
我找到了一种检查中间件是否已连接的方法。您应该在 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);
});
...
但我想这不是最好的解决方案。
我在测试中间件使用时遇到了一些问题,需要你的帮助!
配置我的应用程序:
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 作为存根和间谍)。所以当我为 morgan 用法编写测试用例时:
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() {})
想不通为什么。将中间件用作间谍时,有什么需要注意的地方吗?
提前致谢。
我找到了一种检查中间件是否已连接的方法。您应该在 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);
});
...
但我想这不是最好的解决方案。