如何用Jest和Node.js模拟@google-cloud/secret-manager?
模拟@google-cloud/secret-manager失败的Jest测试问题
我搭建了一个使用Google Secret Manager的Node.js应用,业务代码运行正常,但编写Jest测试时,能成功模拟gcp-metadata,却始终无法正确模拟@google-cloud/secret-manager,试过Stack Overflow上的方案也没用,运行测试后抛出异常。
业务代码
const { SecretManagerServiceClient } = require("@google-cloud/secret-manager"); const gcpMetadata = require("gcp-metadata"); const client = new SecretManagerServiceClient(); module.exports.accessSecret = async (secretName) => { try { const lastEnabledVersion = await getLastEnabledVersion(secretName); if (lastEnabledVersion) { const [version] = await client.accessSecretVersion({ name: lastEnabledVersion, }); return version.payload.data.toString("utf8"); } else { return null; } } catch (err) { console.error("Error occurred with getting secret", err.message); } }; const getLastEnabledVersion = async (secretName) => { const projectId = await gcpMetadata.project("project-id"); const [versions] = await client.listSecretVersions({ parent: `projects/${projectId}/secrets/${secretName}`, }); // get the last enabled version const lastEnabledVersion = versions .filter((v) => v.state === "ENABLED") .sort((a, b) => b.createTime.nanos - a.createTime.nanos); return lastEnabledVersion?.length > 0 ? lastEnabledVersion[0].name : null; };
测试代码
const { accessSecret } = require('../../../helpers/secret-manager'); const gcpMetadata = require('gcp-metadata') const accessResponse = { name: 'projects/74390034/secrets/ACCESS_KEY/versions/1', payload: { data: Buffer.from('test-secret-value', 'utf-8') }, }; const versions = [ { name: 'projects/74390034/secrets/ACCESS_KEY/versions/2', createTime: { seconds: '1725653856', nanos: 943110000 }, destroyTime: null, state: 'DISABLED', replicationStatus: { automatic: {}, replicationStatus: 'automatic' }, etag: '"1621af4cea5129"', clientSpecifiedPayloadChecksum: true, scheduledDestroyTime: null, customerManagedEncryption: null }, { name: 'projects/74390034/secrets/ACCESS_KEY/versions/1', createTime: { seconds: '1709052491', nanos: 685270000 }, destroyTime: null, state: 'ENABLED', replicationStatus: { automatic: {}, replicationStatus: 'automatic' }, etag: '"1621af4bd6dbbb"', clientSpecifiedPayloadChecksum: true, scheduledDestroyTime: null, customerManagedEncryption: null } ] const mClient = { accessSecretVersion: jest.fn(), listSecretVersions: jest.fn() }; jest.mock('@google-cloud/secret-manager', () => { const mSecretManagerServiceClient = jest.fn(() => mClient); return { SecretManagerServiceClient: mSecretManagerServiceClient }; }); jest.mock('gcp-metadata'); describe('Secret Manager', () => { beforeEach(() => { gcpMetadata.project = jest.fn().mockResolvedValueOnce('74390034'); mClient.listSecretVersions.mockResolvedValueOnce([versions]); mClient.accessSecretVersion.mockResolvedValueOnce([accessResponse]); }); test('should retrieve secret successfully', async () => { const result = await accessSecret('ACCESS_KEY'); console.log(result) }, 7000); });
异常信息
运行测试后抛出错误:Cannot read properties of undefined (reading 'listSecretVersions')
内容的提问来源于stack exchange,提问作者Valentina Carrington
相关产品推荐
相关产品推荐

