2017-08-20 47 views
3

我試圖單元測試這段代碼在摩卡:如何觸發Express錯誤中間件?

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

我不知道如何讓我的摩卡單元測試中請求觸發它。

回答

2

首先,我會打出來的中間件到自己的文件/功能。在它坐下時,它與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!') 
    }) 
}) 
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); 
});