Express和sinon:app.use回调函数测试

时间:2020-02-13 11:01:03

标签: unit-testing express mocha sinon

我想知道如何测试此Express片段:

app.use((err, req, res, next) => {
        log.debug(`${MODULE_NAME}:ErrorHandler (ERROR) --> err: ${JSON.stringify(err)}`);
        res.status(err.status).json(err);
      });

使用Sinon和Mocha。我已经浏览了所有互联网,但无济于事。任何帮助将不胜感激。

最诚挚的问候

1 个答案:

答案 0 :(得分:0)

这是单元测试解决方案:

index.js

const express = require('express');

const log = {
  debug: console.log,
};

function createServer() {
  const app = express();
  const MODULE_NAME = 'main';
  app.use((err, req, res, next) => {
    log.debug(`${MODULE_NAME}:ErrorHandler (ERROR) --> err: ${JSON.stringify(err)}`);
    res.status(err.status).json(err);
  });
}

module.exports = createServer;

index.test.js

const sinon = require('sinon');
const proxyquire = require('proxyquire');

describe('60206259', () => {
  it('should pass', () => {
    const mRes = { status: sinon.stub().returnsThis(), json: sinon.stub() };
    const mError = new Error('network');
    mError.status = 500;
    const appStub = { use: sinon.stub().callsFake((mw) => mw(mError, {}, mRes)) };
    const expressStub = sinon.stub().callsFake(() => appStub);
    const createServer = proxyquire('./', {
      express: expressStub,
    });

    createServer();
    sinon.assert.calledOnce(expressStub);
    sinon.assert.calledWithExactly(appStub.use, sinon.match.func);
    sinon.assert.calledWithExactly(mRes.status, 500);
    sinon.assert.calledWithExactly(mRes.status().json, mError);
  });
});

单元测试结果覆盖率100%:

60206259
main:ErrorHandler (ERROR) --> err: {"status":500}
    ✓ should pass (2802ms)


  1 passing (3s)

----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |     100 |      100 |     100 |     100 |                   
 index.js |     100 |      100 |     100 |     100 |                   
----------|---------|----------|---------|---------|-------------------

源代码:https://github.com/mrdulin/expressjs-research/tree/master/src/stackoverflow/60206259