私はモカでユニットテストにコードのこの部分をしようとしている: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);
});