用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。