2017-08-20 4 views

Répondre

2

D'abord, je briser le middleware dans son propre fichier/fonction. Comme il se trouve, il est "intégré" avec l'application Express. Donc, vous n'êtes pas des tests seulement le middleware d'erreur, mais aussi l'instance de l'application Express dans une certaine mesure.

Cela dit, découpler le middleware d'erreur de l'application Express:

src/middleware/error-handler.js

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

Vous continuerez .use() dans la principale app.js ou où vous installez Express:

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

app.use(errorHandler) 

Mais maintenant nous ne sommes plus dépendants d'Express et nous avons une fonction simple que nous pouvons isoler et tester. Voici un test simple avec Jest que vous pouvez facilement ajuster pour travailler avec 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!') 
    }) 
}) 
0

Dans votre itinéraire, vous pouvez passer un objet d'erreur dans le paramètre next. Par exemple:

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

    next(error); 
}); 

ou tout simplement jeter une erreur:

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

    throw new Error(error); 
});