如何模拟 AWS SDK for Go 调用

Sar*_*tts 5 unit-testing mocking request go amazon-web-services

我正在为使用 AWS SDK for Go 从 AWS Secrets Manager 获取密钥的函数编写单元测试:

main.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
    }

 ...
}
Run Code Online (Sandbox Code Playgroud)

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

main_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)
}
Run Code Online (Sandbox Code Playgroud)

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

Vor*_*ung 3

首先,在“AWS SDK for Go API Reference”中找到该服务

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

API调用的原型是

func (c *SecretsManager) GetSecretValueRequest(input *GetSecretValueInput) (req *request.Request, output *GetSecretValueOutput)
Run Code Online (Sandbox Code Playgroud)

所以它返回一个 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
}
Run Code Online (Sandbox Code Playgroud)

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