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