Deno/Oak错误处理中间件测试失败,求正确测试编写方案
错误中间件测试问题修正方案
原有测试的核心问题
- 错误中间件的执行逻辑是捕获自身传入的next函数抛出的错误,你之前的写法把抛错逻辑和错误中间件拆分执行,还传给错误中间件一个空的mockNext,错误中间件根本捕获不到目标错误
- 你写的错误中间件已经内部catch了所有错误,不会往外抛出,所以外层的try/catch完全抓不到错误,校验caught变量的逻辑自然无效
- 没有手动控制
isProduction变量的取值,无法保证测试场景符合生产环境的预期
正确的测试实现
import { testing, assert, assertEquals, Status } from "../deps.ts"; import { errorMiddleware } from "./error-middleware.ts"; // 按你项目中isProduction的判断逻辑调整测试环境,这里假设是从环境变量读取,直接设置为生产环境 Deno.env.set("DENO_ENV", "production"); Deno.test({ name: "生产环境下非HTTP错误会替换为Internal Server Error", async fn() { const mockContext = testing.createMockContext(); // 直接把抛错逻辑作为next传给错误中间件 const mockThrowNext = async () => { // 抛普通非HTTP错误测试替换逻辑 throw new Error("敏感的内部错误信息"); }; // 直接执行错误中间件即可 await errorMiddleware(mockContext, mockThrowNext); // 校验response的状态和返回值 assertEquals(mockContext.response.status, Status.InternalServerError); assertEquals(mockContext.response.body, { status: Status.InternalServerError, message: "Internal Server Error" }); }, }); // 可补充HTTP错误的测试用例,验证HTTP错误不替换消息 Deno.test({ name: "HTTP错误会保留原始错误消息", async fn() { const mockContext = testing.createMockContext(); const mockThrowNext = async () => { // 抛出Oak自带的HTTP错误 mockContext.throw(Status.BadRequest, "参数不合法"); }; await errorMiddleware(mockContext, mockThrowNext); assertEquals(mockContext.response.status, Status.BadRequest); assertEquals(mockContext.response.body, { status: Status.BadRequest, message: "参数不合法" }); }, });
额外注意点
如果要测试开发环境的逻辑,只需要把环境变量调整为开发模式,校验返回的消息是原始错误消息即可。
内容的提问来源于stack exchange,提问作者viztastic
相关产品推荐
相关产品推荐

