我正在为使用适用于 Go 的 AWS 开发工具包从 AWS Secrets Manager 获取 secret 的函数编写单元测试:
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
}
...
}
为了对此进行测试,我需要创建一个模拟 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)
}
我在尝试模拟从 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/