Как создать AWS SDK для звонка Go - PullRequest
0 голосов
/ 21 мая 2018

Я пишу модульный тест для функции, которая использует AWS SDK для Go, чтобы получить секрет от Менеджера секретов AWS:

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().Есть ли простой способ сделать это?Или есть хорошие примеры того, как кто-то это делает?

1 Ответ

0 голосов
/ 23 мая 2018

Сначала найдите службу в «AWS SDK для справочного руководства по API.»

Затем найдите вызов 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)

Так что он возвращает 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".Это должно дать вам большую часть того, что вам нужно

...