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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:06:03