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

问题描述 投票:0回答:1

我想知道如何测试此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。我已经浏览了所有互联网,但无济于事。任何帮助,将不胜感激。

最诚挚的问候

unit-testing express mocha sinon
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.