Jest.mock()失效:测试仍调用@databricks/sql原模块求助
解决Jest模拟@databricks/sql失效的问题
核心问题分析
你的测试超时且mock未生效,主要有两个原因:
- 模拟的
@databricks/sqlAPI结构与原模块不匹配:原模块的方法(如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
相关产品推荐
相关产品推荐

