如何触发Express错误中间件?
How to trigger Express error middleware?
我正在尝试在 Mocha 中对这段代码进行单元测试:
app.use(function (err, req, res, next) {
console.error(err.stack)
res.status(500).send('Something broke!')
})
我不知道如何在 Mocha 单元测试中获取我的请求以触发它。
在您的路由中,您可以在 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);
});
首先,我会将中间件拆分成它自己的 file/function。就目前而言,它是 "integrated" 与 Express 应用程序。因此,您不是在测试 仅 错误中间件,而是在一定程度上测试 Express 应用程序实例。
话虽如此,将错误中间件与 Express 应用分离:
src/middleware/error-handler.js
module.exports = (err, req, res, next) => {
console.error(err.stack)
res.status(500).send('Something broke!')
}
你仍然会 .use()
它在主要 app.js
或者你设置 Express 的任何地方:
const express = require('express')
const errorHandler = require('./src/middleware/error-handler')
const app = express()
app.use(errorHandler)
但现在我们摆脱了 Express 依赖,我们有了一个可以隔离和测试的简单函数。下面是使用 Jest 的简单测试,您可以轻松调整以使用 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!')
})
})
我正在尝试在 Mocha 中对这段代码进行单元测试:
app.use(function (err, req, res, next) {
console.error(err.stack)
res.status(500).send('Something broke!')
})
我不知道如何在 Mocha 单元测试中获取我的请求以触发它。
在您的路由中,您可以在 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);
});
首先,我会将中间件拆分成它自己的 file/function。就目前而言,它是 "integrated" 与 Express 应用程序。因此,您不是在测试 仅 错误中间件,而是在一定程度上测试 Express 应用程序实例。
话虽如此,将错误中间件与 Express 应用分离:
src/middleware/error-handler.js
module.exports = (err, req, res, next) => {
console.error(err.stack)
res.status(500).send('Something broke!')
}
你仍然会 .use()
它在主要 app.js
或者你设置 Express 的任何地方:
const express = require('express')
const errorHandler = require('./src/middleware/error-handler')
const app = express()
app.use(errorHandler)
但现在我们摆脱了 Express 依赖,我们有了一个可以隔离和测试的简单函数。下面是使用 Jest 的简单测试,您可以轻松调整以使用 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!')
})
})