表示中间件testing摩卡柴

有没有办法用express来testing这些中间件:

module.exports = function logMatchingUrls(pattern) { return function (req, res, next) { if (pattern.test(req.url)) { console.log('request url', req.url); req.didSomething = true; } next(); } } 

我发现的唯一中间件testing是:

 module.exports = function(request, response, next) { /* * Do something to REQUEST or RESPONSE **/ if (!request.didSomething) { console.log("dsdsd"); request.didSomething = true; next(); } else { // Something went wrong, throw and error var error = new Error(); error.message = 'Error doing what this does' next(error); } }; describe('Middleware test', function(){ context('Valid arguments are passed', function() { beforeEach(function(done) { /* * before each test, reset the REQUEST and RESPONSE variables * to be send into the middle ware **/ requests = httpMocks.createRequest({ method: 'GET', url: '/css/main.css', query: { myid: '312' } }); responses = httpMocks.createResponse(); done(); // call done so that the next test can run }); it('does something', function(done) { /* * Middleware expects to be passed 3 arguments: request, response, and next. * We are going to be manually passing REQUEST and RESPONSE into the middleware * and create an function callback for next in which we run our tests **/ middleware(responses, responses, function next(error) { /* * Usually, we do not pass anything into next except for errors, so because * in this test we are passing valid data in REQUEST we should not get an * error to be passed in. **/ if (error) { throw new Error('Expected not to receive an error'); } // Other Tests Against request and response if (!responses.didSomething) { throw new Error('Expected something to be done'); } done(); // call done so we can run the next test }); // close middleware }); // close it }); // close context }); // close describe 

这与上面提供的简单中间件(就像testing基本函数和callback)很好地工作,但与更复杂的中间件,我不能得到它的工作。 有没有可能testing这种中间件?

这里有一个你可以使用的简单设置,使用chaisinon

 var expect = require('chai').expect; var sinon = require('sinon'); var middleware = function logMatchingUrls(pattern) { return function (req, res, next) { if (pattern.test(req.url)) { console.log('request url', req.url); req.didSomething = true; } next(); } } describe('my middleware', function() { describe('request handler creation', function() { var mw; beforeEach(function() { mw = middleware(/./); }); it('should return a function()', function() { expect(mw).to.be.a.Function; }); it('should accept three arguments', function() { expect(mw.length).to.equal(3); }); }); describe('request handler calling', function() { it('should call next() once', function() { var mw = middleware(/./); var nextSpy = sinon.spy(); mw({}, {}, nextSpy); expect(nextSpy.calledOnce).to.be.true; }); }); describe('pattern testing', function() { ... }); }); 

从那里,你可以添加更详细的模式匹配等testing。因为你只使用req.url ,你不必嘲笑整个Request对象(由Express创build),你可以使用一个简单的具有url属性的对象。