unit testingExpress Middleware的正确方法

我有一个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; 

我为我的TDD使用了mochachainode-mocks-http ,当next()不会被调用时,我的问题围绕着testing, 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(); }); 

在上面的第一个testing中,我期待这个通过,所以我传递一个函数作为next()函数,并通过了这个testing。 在第二个testing中,我期待这个失败,所以如果我传入一个函数,那么mocah会抱怨testing已经超过了2000ms,因为callback函数从来没有被调用过,因为res.send()正在处理它这个实例。

我在第二次testing的时候是否正确的说到了unit testing这样的Express中间件,还是有更好/更可取的方法来做到这一点?

编辑:所以只是为了澄清,我专注于testingsinon ,当下一个callback将不会被调用,我显然是重复的问题是看着用sinon来检查下一个被调用。 我期待看到如何unit testingcallback函数将不会被调用。

看看这个答案

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