如何触发Express错误中间件?

时间:2017-08-20 16:20:14

标签: node.js unit-testing express mocha supertest

我正在尝试在Mocha中对这段代码进行单元测试:

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

我不知道如何在Mocha单元测试中获取我的请求来触发它。

2 个答案:

答案 0 :(得分:4)

首先,我将中间件分解为自己的文件/功能。它坐在那里,它已经整合了#34;使用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)

__tests__/middleware/error-handler.test.js

但是现在我们没有Express依赖,我们有一个简单的功能,我们可以隔离和测试。以下是使用Jest的简单测试,您可以轻松调整该测试以使用Mocha。

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!') }) })

USE

答案 1 :(得分:0)

在您的路线中,您可以在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);
});