2015-12-29 3 views
7

Есть ли способ, чтобы проверить эти виды промежуточного программного обеспечения в курьерским:экспресс промежуточного тестирования мокко 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(); 
    } 
} 

только промежуточного тестирования я нашел было:

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 

Эта работа хорошо с простой промежуточного (это похоже на тестирование базовой функции с обратным вызовом), описанное выше, но с более сложным промежуточным программным обеспечением я не могу заставить его работать. Возможно ли протестировать это промежуточное ПО?

ответ

13

Вот простой установки, которую можно использовать, используя 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.

Смежные вопросы