首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模拟AWS Go SSM调用

模拟AWS Go SSM调用
EN

Stack Overflow用户
提问于 2019-11-20 02:49:48
回答 2查看 898关注 0票数 0

我尝试使用this example,但是使用它来模拟SSM GetParameter调用。我要做的就是发送inputParameter的值,并验证输出是否为outputParameter的值。

当我运行go test时,它只是抛出我定义的错误,但不确定为什么。我做错了什么?

下面是我的函数:

代码语言:javascript
复制
package main

import (
        "fmt"
        "log"
        "github.com/aws/aws-sdk-go/aws"
        "github.com/aws/aws-sdk-go/aws/session"
        "github.com/aws/aws-sdk-go/service/ssm"
        "github.com/aws/aws-sdk-go/service/ssm/ssmiface"

)

type AWS struct {
        Config  *aws.Config
        Session *session.Session
        SSM     ssmiface.SSMAPI
}



func (self *AWS) GetSSMValue(SSMPath string) string {
        req, err := self.SSM.GetParameter(&ssm.GetParameterInput{
                Name:           aws.String(SSMPath),
                WithDecryption: aws.Bool(false),
        })
        if err != nil {
                log.Fatalln("Unable to retrieve value: ", err)
        }
        SSMValue := *req.Parameter.Value

        return SSMValue
}


func main() {
        Aws := new(AWS)
        Aws.Config = &aws.Config{Region: aws.String("us-west-2")}
        Aws.Session, _ = session.NewSession(Aws.Config)

        ssmsvc := ssm.New(Aws.Session)
        Aws.SSM = ssmiface.SSMAPI(ssmsvc)

        inputParam := "/path/to/my/parameter"
        myValue := Aws.GetSSMValue(inputParam)
        fmt.Println(myValue)

}

我的测试是:

代码语言:javascript
复制
package main

import (
        "errors"
        "github.com/aws/aws-sdk-go/service/ssm"
        "github.com/aws/aws-sdk-go/service/ssm/ssmiface"
        "testing"
)

type mockSSM struct {
        ssmiface.SSMAPI
        response string
        err  error
}

func (sp *mockSSM) GetParameter(input *ssm.GetParameterInput) (*ssm.GetParameterOutput, error) {
        output := new(ssm.GetParameterOutput)
        return output, sp.err

}

func TestGetSSMValue(t *testing.T) {
        inputParameter := "path/to/my/test"
        outputParameter := "MyTestOutput"
        retriever := new(AWS)
        retriever.SSM = &mockSSM{
                response: outputParameter,
                err:  errors.New("my custom error"),
        }
        if actualValue := retriever.GetSSMValue(inputParameter); actualValue != outputParameter {
                t.Errorf("Expected %q but got %q", outputParameter, actualValue)
        }

}
EN

回答 2

Stack Overflow用户

发布于 2019-11-20 15:59:37

实际上一切都是正确的,您只需要添加一行代码来初始化output.Parameter:output.Parameter = &ssm.Parameter{Value: aws.String("MyTestOutput")}

你的func必须看起来像这样:

代码语言:javascript
复制
func (sp *mockSSM) GetParameter(input *ssm.GetParameterInput) (*ssm.GetParameterOutput, error) {
    output := new(ssm.GetParameterOutput)
    output.Parameter = &ssm.Parameter{Value: aws.String("MyTestOutput")}
    return output, nil
}
票数 1
EN

Stack Overflow用户

发布于 2019-11-20 07:25:09

我必须将模拟的输出插入到测试模块的GetParameter()函数中。这似乎起作用了:

代码语言:javascript
复制
func (sp *mockSSM) GetParameter(input *ssm.GetParameterInput) (*ssm.GetParameterOutput, error) {
        // Defines actual value that is received in the response
        output := &ssm.GetParameterOutput{
                Parameter: &ssm.Parameter{
                        Type: aws.String("String"),
                        Value: aws.String("MyTestOutput"),
                },
        }
        return output, nil

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58940962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档