amazon-web-services - 如何为 Go 调用模拟 AWS SDK

标签 amazon-web-services unit-testing go request mocking

我正在为使用适用于 Go 的 AWS 开发工具包从 AWS Secrets Manager 获取 secret 的函数编写单元测试:

ma​​in.go

//Helper function to get secret from AWS Secret Manager
func getAWSSecrets(svc secretsmanageriface.SecretsManagerAPI) (secretMap map[string]string, err error) {
    //Get secret config values
    req, resp := svc.GetSecretValueRequest(&secretsmanager.GetSecretValueInput{
        SecretId: aws.String("my/secret/string"),
    })

    err = req.Send()
    if err != nil {
        return nil, err
    }

 ...
}

为了对此进行测试,我需要创建一个模拟 AWS Secret Manager 客户端。我已经设置了它如何工作的基本框架:

ma​​in_test.go

type MockSecretsManagerClient struct {
  secretsmanageriface.SecretsManagerAPI
} 

func (m *MockSecretsManagerClient) GetSecretValueRequest(input *secretsmanager.GetSecretValueInput) (req *request.Request, resp *secretsmanager.GetSecretValueOutput){
  // Confused on how to mock out the returned `req`
}


// tests getAWSSecrets
func (suite *ServerTestSuite) TestGetAWSSecrets() {
    //Setup test 
  mockSvc := &MockSecretsManagerClient{}
  req, resp := getAWSSecrets(mockSvc)
}

我在尝试模拟从 GetSecretValueRequest 返回的请求时遇到了麻烦。此外,一旦我模拟了这个请求,我就不确定如何处理模拟 req.Send()。有没有简单的方法可以做到这一点?或者有没有人这样做的好例子?

最佳答案

首先,在 "AWS SDK for Go API Reference."

然后查找 API 调用。你的电话就在这里 https://docs.aws.amazon.com/sdk-for-go/api/service/secretsmanager/#SecretsManager.GetSecretValueRequest

API调用的原型(prototype)是

func (c *SecretsManager) GetSecretValueRequest(input *GetSecretValueInput) (req *request.Request, output *GetSecretValueOutput)

所以它返回一个 request.Request 和一个 GetSecretValueOutput

这两个输出项是结构体,它们在文档中有链接。模拟应该以相同的方式返回这两个项目,即

func (m *MockSecretsManagerClient) GetSecretValueRequest(input *secretsmanager.GetSecretValueInput) (req *request.Request, resp *secretsmanager.GetSecretValueOutput) {

    req = new(request.Request)
    r := new(http.Response)
    r.Status = "200 OK"
    r.Status = 200
    req.HTTPRequest = r
    resp.SecretString = new(String("this is the dummy value"))

    return
}

如果您需要将模拟值模拟为来自实时 API 服务的“真实”数据,则编写一个快速程序来执行调用并使用 "%# Printf 返回值v" 格式。这应该可以满足您的大部分需求

关于amazon-web-services - 如何为 Go 调用模拟 AWS SDK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50454370/

相关文章:

c++ - Jenkins xUnit 插件问题

c++ - 编写谷歌测试的最佳实践是什么?

vim - 当我使用 Janus vim 处理 golang 文件时,如何在 Vim 中删除此消息?

Golang crypto/sha256 - 相同的输入产生不同的输出

arrays - 如何生成数字序列

amazon-web-services - 云形成完成后如何发送SNS通知?

amazon-web-services - 如何在 AWS 上部署 Kubernetes?

amazon-web-services - 拒绝所有 S3 存储桶的 GetObject

amazon-web-services - 不支持 `aws:ResourceTag` 的 IAM 策略

unit-testing - 在没有启动嵌入式 tomcat 的情况下运行 grails 功能测试