2017-08-20 7 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); 
}); 
関連する問題