用mocha和sinon-chaitesting中间件的使用情况
我在testingmiddelware的使用上遇到一些问题,需要你的帮助!
configuration我的app:
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; };
我想用testing来覆盖它(使用摩卡,并用sinon-chai作为存根和间谍)。 所以当我为摩根语写作testing用例时:
app.use(morgan('dev'));
我设置app.use()作为间谍,并期望它与摩根('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() {})
不知道为什么。 当作为间谍使用中间件使用函数时,有什么需要关注的吗?
提前致谢。
我find了一种方法来检查中间件是否连接。 你应该在app._router.stack
查找它。 我已经写了一个这样做的function,它看起来像:
function isMiddlewareSet(app, middlewareName) { var _return = false; app._router.stack.filter(function(layer) { if (layer.handle.name == middlewareName) { _return = true; } }); return _return; }
然后我在testing中使用它。
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); }); ...
但我想这不是最好的解决scheme。