当前位置:  开发笔记 > 编程语言 > 正文

正确的单元测试Express Middleware的方法

如何解决《正确的单元测试ExpressMiddleware的方法》经验,为你挑选了1个好方法。

我有一个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用来检查下一个是否被调用.我期待看到如何在不调用回调函数时进行单元测试.



1> 小智..:

看看这个答案

/sf/ask/17360801/

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

});

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有