使用Jest模拟AWS SecretsManager出现Missing region in config及返回值异常
Jest模拟AWS SecretsManager常见问题修复方案
1 ConfigError: Missing region in config 报错修复
该错误触发原因是AWS SDK实例化SecretsManager客户端时,默认会校验region配置参数,即使你mock了构造函数,底层配置校验逻辑仍会触发。
修复方案是在测试文件最顶部、所有import语句之前提前注入region环境变量即可:
process.env.AWS_REGION = 'us-east-1'
2 getSecretValue无法返回预期密钥值的修复
该问题由两个不匹配导致:
- 业务代码使用回调模式调用
getSecretValue,但现有mock逻辑直接返回值,没有触发传入的回调函数 - 业务代码的
randomMethod是async函数,但未等待异步操作执行完成,调用方获取返回值时回调逻辑还未执行
2.1 调整mock实现匹配回调调用逻辑
修改测试文件中的mock代码,主动调用传入的回调参数传递结果:
// index.test.js const mockGetSecretValue = jest.fn((SecretId) => { switch (SecretId) { case process.env.GITHUB_PERSONAL_TOKEN: return { SecretString: process.env.GITHUB_PERSONAL_TOKEN_VALUE, } default: throw Error("secret not found") } }) jest.mock("aws-sdk/clients/secretsmanager", () => { return jest.fn(() => { return { getSecretValue: jest.fn((params, callback) => { try { const result = mockGetSecretValue(params.SecretId) callback(null, result) } catch (err) { callback(err, null) } }) } }) })
2.2 调整业务代码异步逻辑(可选但推荐)
为了方便异步调用和测试,建议将回调模式改为Promise模式,修改业务代码如下:
// index.ts import SM from "aws-sdk/clients/secretsmanager" const secretManagerClient = new SM() export const randomMethod = async (a: string, b: string) => { const personalToken = { SecretId: process.env.secretId, } const data = await secretManagerClient.getSecretValue(personalToken).promise() return data.SecretString }
如果需要保留原有回调写法,可以将异步逻辑包装为Promise:
// index.ts export const randomMethod = async (a: string, b: string) => { const personalToken = { SecretId: process.env.secretId, } return new Promise((resolve, reject) => { secretManagerClient.getSecretValue(personalToken, (err, data) => { if (err) { console.error(`[SECRETS MANAGER] Error fetching personal token : ${err}`) reject(err) } else if (data && data.SecretString) { resolve(data.SecretString) } }) }) }
2.3 环境变量匹配校验
注意测试环境下需要保证业务代码使用的process.env.secretId和mock判断用的process.env.GITHUB_PERSONAL_TOKEN值一致,避免走到默认分支抛出错误,可以在测试文件顶部统一配置:
// index.test.js 顶部配置 process.env.secretId = 'test-github-token-id' process.env.GITHUB_PERSONAL_TOKEN = 'test-github-token-id' process.env.GITHUB_PERSONAL_TOKEN_VALUE = 'mock-secret-value-123'
2.4 测试用例示例
调用async方法时需要加await等待执行完成再做断言:
test('should return correct secret value', async () => { const secret = await randomMethod('test-param1', 'test-param2') expect(secret).toBe('mock-secret-value-123') expect(mockGetSecretValue).toHaveBeenCalledWith('test-github-token-id') })
内容的提问来源于stack exchange,提问作者Fares
相关产品推荐
相关产品推荐

