如何触发Express错误中间件?

我试图在摩卡unit testing这段代码:

app.use(function (err, req, res, next) { console.error(err.stack) res.status(500).send('Something broke!') }) 

我不知道如何在摩卡unit testing中得到我的请求来触发它。

首先我将中间件分解成它自己的文件/函数。 当它坐落时,它与Express应用程序“集成”。 所以你不是testing错误中间件,而是快速应用程序实例的程度。

就这样说,从Express应用程序中分离错误中间件:

src/middleware/error-handler.js

 module.exports = (err, req, res, next) => { console.error(err.stack) res.status(500).send('Something broke!') } 

你仍然可以在主要的app.js.use()或者你在哪里设置Express):

 const express = require('express') const errorHandler = require('./src/middleware/error-handler') const app = express() app.use(errorHandler) 

但是现在我们没有Express依赖关系,并且我们有一个简单的函数可以分离和testing。 下面是Jest的简单testing,您可以轻松调整以适用于Mocha。

__tests__/middleware/error-handler.test.js

 const errorHandler = require('../../src/middleware') describe('middleware.ErrorHandler', () => { /** * Mocked Express Request object. */ let req /** * Mocked Express Response object. */ let res /** * Mocked Express Next function. */ const next = jest.fn() /** * Reset the `req` and `res` object before each test is ran. */ beforeEach(() => { req = { params: {}, body: {} } res = { data: null, code: null, status (status) { this.code = status return this }, send (payload) { this.data = payload } } next.mockClear() }) test('should handle error', () => { errorHandler(new Error(), req, res, next) expect(res.code).toBeDefined() expect(res.code).toBe(500) expect(res.data).toBeDefined() expect(res.data).toBe('Something broke!') }) }) 

在你的路线中,你可以next参数中传递一个错误对象。 例如:

 app.get('/some-route', (req, res, next) => { const error = {....}; next(error); }); 

或者只是抛出一个错误:

 app.get('/some-route', (req, res, next) => { const error = {....}; throw new Error(error); }); 
Interesting Posts