You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 18:15:00