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

Jest.mock()失效:测试仍调用@databricks/sql原模块求助

解决Jest模拟@databricks/sql失效的问题

核心问题分析

你的测试超时且mock未生效,主要有两个原因:

  • 模拟的@databricks/sql API结构与原模块不匹配:原模块的方法(如connect、openSession)直接返回Promise,但你的mock返回的是带有promise方法的对象,导致await无法正确解析,最终超时。
  • 模块级实例化时机:待测试文件中databricksClient = new DBSQLClient()是在模块加载时执行的,若mock未提前生效,会直接实例化原模块的类。

具体修复步骤

1. 修正mock的API结构,匹配原模块的Promise返回

将mock中所有方法改为直接返回Promise,而非嵌套promise方法的对象。修改后的@databricks/sql mock如下:

jest.mock("@databricks/sql", () => {
  return {
    DBSQLClient: function () {
      return {
        // connect直接返回resolved Promise
        connect: () => Promise.resolve(),
        openSession: () => Promise.resolve({
          executeStatement: () => Promise.resolve({
            fetchAll: () => Promise.resolve(mockResponse),
            close: () => Promise.resolve()
          })
        }),
        close: () => Promise.resolve()
      };
    },
  };
});

这样await databricksClient.connect()就能正确解析,不会卡住。

2. 调整测试文件的模块加载顺序

确保jest.mock在加载待测试模块前执行(Jest会自动提升jest.mock到顶部,但显式放在最顶部更稳妥):

// 先定义mock
jest.mock("@databricks/sql", () => { /* ... */ });
jest.mock("aws-sdk", () => { /* ... */ });

// 再导入依赖和待测试模块
import mockResponse from "./mockResponse.json";
const { handler } = require("../../../backend/function/dataLakeConnect/src/index");

3. 验证模块导出结构(可选)

如果mock仍未生效,可在待测试文件中临时添加打印,确认@databricks/sql的导出结构:

console.log(require("@databricks/sql"));

若原模块的DBSQLClient是默认导出,需调整mock为:

jest.mock("@databricks/sql", () => {
  return {
    default: function () { /* ... */ }
  };
});

同时待测试文件的导入也要改为const DBSQLClient = require("@databricks/sql").default;。

4. 清理模块缓存(可选)

如果之前的测试残留了模块缓存,可在测试前强制清除:

beforeEach(() => {
  jest.resetModules();
});

修复后的完整测试文件示例

jest.mock("@databricks/sql", () => {
  return {
    DBSQLClient: function () {
      return {
        connect: () => Promise.resolve(),
        openSession: () => Promise.resolve({
          executeStatement: () => Promise.resolve({
            fetchAll: () => Promise.resolve(mockResponse),
            close: () => Promise.resolve()
          })
        }),
        close: () => Promise.resolve()
      };
    },
  };
});

jest.mock("aws-sdk", () => {
  return {
    SecretsManager: function () {
      return {
        getSecretValue: ({ SecretId }) => {
          if (SecretId === "credentials/databricks/read-write") {
            return {
              promise: () => Promise.resolve({
                ARN: "x",
                Name: "credentials/databricks/read-write",
                VersionId: "x",
                SecretString:
                  '{"DATABRICKS_TOKEN":"test","DATABRICKS_SERVER_HOSTNAME":"test.test.com","DATABRICKS_HTTP_PATH":"/pathy/pathpath/mcgee"}',
                VersionStages: ["x"],
                CreatedDate: "x",
              })
            };
          } else {
            throw new Error("mock error");
          }
        },
      };
    },
  };
});

import mockResponse from "./mockResponse.json";
const { handler } = require("../../../backend/function/dataLakeConnect/src/index");

const testEvent = {
  arguments: {
    page: 1,
    clientId: "test",
    startTime: "2022-09-26 00:00:00",
    endTime: "2022-09-27 00:00:00",
  },
};

describe("dataLakeConnect", () => {
  test("should return expected array", async () => {
    const res = await handler(testEvent);
    expect(res).toEqual(mockResponse);
  });
});

内容的提问来源于stack exchange,提问作者Alisha Edington

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 05:40:32