Dans le cadre de la migration d'une application plus ancienne d'ExpressJs vers Koa JS (v1). J'ai écrit un morceau de middleware pour gérer les erreurs qui se produisent. Il ressemble à ceci:Comment tester un middleware Koa personnalisé pour la gestion des erreurs?
module.errors = function * (next) {
try {
yield next;
} catch (err) {
switch(err && err.message) {
case: 'Bad Request':
this.status = 400;
this.body = {message: 'Bad Request'};
brea;
default:
this.status = 500;
this.body = {message: 'An error has occurred'};
}
this.app.emit('error', err, this);
}
}
Il sera inclus dans ma demande comme ceci:
const app = require('koa')();
const router = require('koa-router');
const { errors } = require('./middleware/errors');
app.use(errors)
.use(router.routes());
app.get('/some-request', function *(next){
// request that could error
});
app.listen();
Tout cela fonctionne très bien, mais je voudrais tester le middleware avec mes tests unitaires, et peut-être parce que je suis encore relativement nouveau dans les fonctions Koa et Generator, j'ai du mal à comprendre comment faire cela.
Je sais que si j'importe le middleware de gestion d'erreur, je dois lui passer une fonction qui va générer une erreur, mais comment j'exécute la fonction passée? Est-ce que ce doit être une fermeture de quelque description? Comment puis-je affirmer/attendre sur les valeurs définies pour le code d'état et similaires?
const { expect } = require('chai');
const { errors } = require('../middleware/errors');
describe('errors middleware',() => {
it('returns a 500 on a generic error',() => {
let thrower = function(){ throw new Error() }
let errorHandler = errors(thrower());
// mass of confusion
expect(errorHandler.next()).to.throw(Error);
});
});