У меня есть кусочек промежуточного программного обеспечения 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
, чтобы проверить, вызвано ли следующее. Я смотрю, как тестировать блок, когда функция обратного вызова НЕ будет вызываться.
Я редактировал вопрос, чтобы показать, как она отличается от вопроса я, по-видимому, повторяющим. –
Можете ли вы использовать синон, чтобы шпионить за функцией res? например 'вар разрешением = {StatusCode: sinon.spy()};' попробуйте '(res.statusCode) .should.equal (500)' – esperluette