我試圖單元測試這段代碼在摩卡:如何觸發Express錯誤中間件?
app.use(function (err, req, res, next) {
console.error(err.stack)
res.status(500).send('Something broke!')
})
我不知道如何讓我的摩卡單元測試中請求觸發它。
我試圖單元測試這段代碼在摩卡:如何觸發Express錯誤中間件?
app.use(function (err, req, res, next) {
console.error(err.stack)
res.status(500).send('Something broke!')
})
我不知道如何讓我的摩卡單元測試中請求觸發它。
首先,我會打出來的中間件到自己的文件/功能。在它坐下時,它與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
或任何你設置快報:
const express = require('express')
const errorHandler = require('./src/middleware/error-handler')
const app = express()
app.use(errorHandler)
但是現在我們沒有Express依賴關係,並且我們可以分離和測試一個簡單的函數。下面是一個簡單的測試Jest,您可以輕鬆調整以適用於摩卡。
__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);
});