2017-01-13 9 views
2

У меня есть кусочек промежуточного программного обеспечения Express, установленный для проверки допустимого заголовка Content-Type во всех моих POST-запросах, попавших на мой сервер, код для этого промежуточного программного обеспечения ниже:Правильный способ модульного теста Express Middleware

import * as STRINGS from "../Common/strings"; 

function ContentTypeValidator(req, res, next) { 
    let contentHeader = req.get("content-type"); 
    if(!contentHeader) { 
     res.status(400).send(STRINGS.ERROR_CONTENT_TYPE_MISSING); 
    } else { 
     if(contentHeader.toLowerCase() !== "application/json") { 
      res.status(415).send(STRINGS.ERROR_CONTENT_TYPE_UNSUPPORTED); 
     } else { 
      next(); 
     } 
    } 
} 

export default ContentTypeValidator; 

Я использую mocha, chai и node-mocks-http для моего TDD и мой вопрос окружает испытания, когда next() не будет называться res.send() будет обрабатывать окончание этого запроса для меня.

it("Should return 200 for valid Content-Type header", (done) => { 
    req = nodeMocks.createRequest({ 
     headers: { 
      "Content-Type": "application/json" 
     } 
    }); 
    ContentTypeValidator(req, res, (err) => { 
     res.statusCode.should.equal(200); 
     expect(err).to.be.undefined; 
     done(); 
    }); 
}); 

it("Should return 400 if Content-Type header is missing", (done) => { 
    ContentTypeValidator(req, res,() => {}); 
    res.statusCode.should.equal(400); 
    res._getData().should.equal("Content-Type header missing"); 
    done(); 
}); 

В первом тесте выше, я ожидал этого пройти, поэтому я передаю в функцию, чтобы действовать в качестве функции next() и этот тест проходит. Во втором тесте я ожидаю, что это сработает, поэтому, если я передам функцию, то mocah жалуется, что тест превысил 2000 мс, поскольку функция обратного вызова никогда не вызывается, что следует ожидать, так как res.send() обрабатывает ее в этом экземпляре.

Является ли способ, которым я написал второй тест, правильно, когда дело доходит до модульного тестирования. Например, промежуточное ПО Express или это лучший/более целесообразный способ сделать это?

EDIT: Поэтому, чтобы уточнить, я сосредоточен на желании проверить среднее белье, когда следующий обратный вызов НЕ будет вызван, вопрос, который я, по-видимому, дублирует, смотрит на использование sinon, чтобы проверить, вызвано ли следующее. Я смотрю, как тестировать блок, когда функция обратного вызова НЕ будет вызываться.

+0

Я редактировал вопрос, чтобы показать, как она отличается от вопроса я, по-видимому, повторяющим. –

+0

Можете ли вы использовать синон, чтобы шпионить за функцией res? например 'вар разрешением = {StatusCode: sinon.spy()};' попробуйте '(res.statusCode) .should.equal (500)' – esperluette

ответ

-1

Заканчивать этот ответ

https://stackoverflow.com/a/34517121/4996928

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

}); 
+0

я действительно видел, что один, но этот ответ кажется более сфокусирован на использовании 'sinon', чтобы проверить, что' next() 'фактически вызван. В моем случае я не могу позвонить дальше, поскольку ответ будет отклонен до его вызова. –

+0

https://www.youtube.com/watch?v=BwNMUVzo3vs –