我正在try 使用jest.mock函数模拟@databricks/sql
包,它不断地从 node 模块包中拉出,而不是我传递到该函数中的代码.
我的测试文件:
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",
},
};
const exampleResponse = {
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",
};
jest.mock("@databricks/sql", () => {
return {
DBSQLClient: function () {
return {
connect: function () {
return {
promise: function () {},
};
},
openSession: function () {
console.log("openSession called");
return {
promise: function () {
return {
executeStatement: function (sql, params) {
return {
promise: function () {
return {
fetchAll: function () {
return {
promise: function () {
return mockResponse;
},
};
},
};
},
};
},
};
},
};
},
};
},
};
});
jest.mock("aws-sdk", () => {
return {
SecretsManager: function () {
return {
getSecretValue: function ({ SecretId }) {
if (SecretId === "credentials/databricks/read-write") {
return {
promise: function () {
return exampleResponse;
},
};
} else {
throw new Error("mock error");
}
},
};
},
};
});
describe("dataLakeConnect", () => {
test("should return expected array", async () => {
let res = await handler(testEvent);
expect(res).toEqual(mockResponse);
});
});
我正在try 测试的函数:
const AWS = require("aws-sdk");
const { DBSQLClient } = require("@databricks/sql");
const client = new AWS.SecretsManager({
region: "us-east-1",
});
console.log(AWS);
console.log(DBSQLClient);
const databricksClient = new DBSQLClient();
const resultsPerPage = 300;
const getSecret = async (secretName) => {
try {
let data = await client.getSecretValue({ SecretId: secretName }).promise();
if (data.SecretString) {
return JSON.parse(data.SecretString);
}
} catch (err) {
throw err;
}
};
exports.handler = async (event) => {
console.log(`EVENT: ${JSON.stringify(event)}`);
const { page, clientId, startTime, endTime } = event.arguments;
const offset = resultsPerPage * (page - 1);
let sql = `SELECT * FROM test`;
try {
const creds = await getSecret("credentials/databricks/read-write");
// console.log(databricksClient);
await databricksClient.connect({
token: creds.DATABRICKS_TOKEN,
host: creds.DATABRICKS_SERVER_HOSTNAME,
path: creds.DATABRICKS_HTTP_PATH,
});
const session = await databricksClient.openSession();
const queryOperation = await session.executeStatement(sql, {
runAsync: true,
maxRows: 10000,
});
const result = await queryOperation.fetchAll({
progress: false,
callback: () => {},
});
await queryOperation.close();
await session.close();
await databricksClient.close();
return result;
} catch (err) {
throw err;
}
};
我期望此文件中的控制台日志(log)返回模拟代码,aws-sdk
模拟似乎工作正常,然而,@databricks/sql
控制台日志(log)返回原始模块,这会导致测试超时.
我试着像JEST建议的那样,将这些mock放在 node 模块旁边的__mocks__
目录下,但最后出现错误,说Jest找不到包.
有没有什么建议可以让@databricks/sql
模拟游戏真正发挥作用呢?我被难住了.