有没有办法在Express中测试那种中间件:
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(); } }
我发现的唯一中间件测试是:
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
这与上面提供的简单中间件(它像测试回调的基本功能)很好地配合,但是使用更复杂的中间件我无法使其工作.是否有可能测试这种中间件?
这是一个简单的设置,您可以使用,使用chai
和sinon
:
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() { ... }); });
从那里,您可以为模式匹配等添加更精细的测试.由于您只是使用req.url
,您不必模拟整个Request
对象(由Express创建),您可以只使用带有url
属性的简单对象.