2015-12-29 13 views
7

Gibt es eine Möglichkeit, diese Art von Middleware in Express zu testen:Express Middleware Test Mokka chai

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(); 
    } 
} 

Die einzigen Middleware-Tests fand ich waren:

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 

Diese Arbeit gut mit der einfachen Middleware (es ist wie das Testen der Basisfunktion mit Callback) oben zur Verfügung gestellt, aber mit komplexeren Middleware kann ich es nicht funktionieren. Ist es möglich, diese Art von Middleware zu testen?

Antwort

13

Hier ist eine einfache Einrichtung, die Sie, mit chai und sinon verwenden:

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() { 
    ... 
    }); 

}); 

Von dort Sie aufwändigere Tests für den Mustervergleich hinzufügen, etc. Da sind Sie nur req.url verwenden, können Sie muss nicht ein ganzes Request-Objekt (wie von Express erstellt) vortäuschen und Sie können einfach ein einfaches Objekt mit einer url-Eigenschaft verwenden.

Verwandte Themen