我有一段Express中间件设置为在我的服务器的所有POST请求中检查有效的Content-Type标头,该中间件的代码如下:
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中间件时,我编写第二个测试的方式是否正确?还是有更好/更明智的方法来做到这一点?
编辑:所以只是为了澄清一下,我专注于想要测试中间件时不会调用下一个回调,我显然重复的问题是看着使用sinon
检查下一步叫做。我期待看到如何在不调用回调函数时进行单元测试。
答案 0 :(得分:7)
查看此答案
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() {
...
});
});