gpt4 book ai didi

javascript - 如何测试自定义 Koa 中间件的错误处理?

转载 作者:太空宇宙 更新时间:2023-11-03 22:28:52 25 4
gpt4 key购买 nike

作为旧应用程序从 ExpressJs 迁移到 Koa JS (v1) 的一部分。我编写了一个中间件来处理发生的任何错误。它看起来像这样:

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);
}
}

它像这样包含在我的应用程序中:

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();

这一切都工作正常,但我想通过单元测试来测试中间件,也许因为我对 Koa 和 Generator 功能还相当陌生,所以我正在努力弄清楚如何做到这一点。

我知道如果我导入错误处理中间件,我需要向它传递一个会抛出错误的函数,但是如何执行传递的函数?是否需要关闭某些描述?如何断言/期望状态代码等设置的值?

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);
});
});

最佳答案

Koa 中间件是生成器(多次返回/yield)并且行为不像函数,所以为它们编写单元测试感觉很奇怪。就我个人而言,我对端到端测试用例就足够了。

但是,以下方法可能适用于您的情况。

const { expect } = require('chai');
const { errors } = require('../middleware/errors');

describe('errors middleware', () => {

it('returns a 500 on a generic error', () => {

let ctx = { body: {}, status: 404 };

let errorMidIterator = errors().call(ctx, 'NEXT_MID');

// test that it correctly yields to next middleware
expect(errorMidIterator.next().value).should.equal('NEXT_MID');

// simualte an error and test if it correctly sets the body
expect(errorMidIterator.throw(new Error()).done).to.equal(true);
expect(ctx.status).should.equal(500);
});
});

顺便说一句,我认为从文件中导出中间件工厂比普通的中间件生成器函数更好。前者为您提供了更多控制权(即您可以通过工厂函数参数注入(inject)一些依赖项,在本例中为 thrower() 函数)。我的中间件文件如下所示。

module.exports = function MyMiddleware(options) {
return function *MyMiddleware(next) {
// options.config.foo
// options.httpclient.get(..)
};
}

最后 koa 用 co 包装了生成器函数,这改变了语义,因此单元测试没有那么有用(主观)

关于javascript - 如何测试自定义 Koa 中间件的错误处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40870237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com