登录
首页 >  Golang >  Go问答

如何在golang中模拟request.Request

来源:stackoverflow

时间:2024-04-06 19:00:36 458浏览 收藏

各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题《如何在golang中模拟request.Request》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很不错的话,欢迎各位多多点评和分享!

问题内容

我正在使用 github.com/aws/aws-sdk-go/aws/request 来获取预签名 URL,我需要将其上传文件到 AWS 中的 s3 存储桶。我目前正在编写测试,为此我需要模拟 func (r *Request) Presign(expire time.Duration)request.Request 是一个结构体,而不是一个接口,所以我不知道如何模拟它。


解决方案


这并没有直接回答您的问题,但它可能会完全消除问题的基础。

go 中的一个巧妙之处是,您可以使用接口轻松隔离依赖项。如果您的代码(需要测试的部分)间接使用 presign,则测试很简单。

即创建一个界面

type higherlevelaws interface {
    upload(file string) error
}

并在代码中使用此接口以及 upload。然后你可以使用例如轻松地模拟它https://godoc.org/github.com/stretchr/testify/mock

实际的实现,看起来像这样

type actualawsimpl struct {
    aws *aws.client
}

func (a *actualawsimpl) upload(file string) error {
    aws.presign...
}

这允许您测试代码的业务部分,但当然,仍然会在 actualawsimpl 中留下未经测试的代码。然而,这些未经测试的代码可以通过 aws sdk 本身中的单元和集成测试来保证正常工作。 不管怎样,在我的组织中,我们使用在 docker 中运行的假 aws 服务(例如 https://github.com/gliffy/fake-s3)来测试这一点。

我必须模拟 s3 命令的请求。代码如下:

req, result := r.s3.listobjectsv2request(&s3.listobjectsv2input{
        bucket: aws.string(configs.settings.s3bucket),
    })

    err := req.send()

mock 函数必须返回一个请求对象

func (m *mockS3ProviderClient) ListObjectsV2Request(input *s3.ListObjectsV2Input) (req *request.Request, output *s3.ListObjectsV2Output) {

    err := input.Validate()
    req = &request.Request{
        HTTPRequest: &http.Request{},
        Error:       err,
    }

    output = &s3.ListObjectsV2Output{
        Contents: []*s3.Object{
            {Key:aws.String("File1")},
            {Key:aws.String("File2")},
        },
    }

    return req, output
}

本篇关于《如何在golang中模拟request.Request》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>