登录
首页 >  Golang >  Go问答

使用 Golang 中 s3.S3 对象进行单元测试

来源:stackoverflow

时间:2024-02-17 11:27:23 161浏览 收藏

各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题《使用 Golang 中 s3.S3 对象进行单元测试》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很不错的话,欢迎各位多多点评和分享!

问题内容

我应该如何对以下代码进行单元测试。我试图使用 coutnerfiter 来伪造输入“*s3.s3”对象,但它对我不起作用。我是 counerfiter 和 go 的新手,有人可以帮助我吗?

func (l *listContentImp) ListS3Content(client *s3.S3) (bool, error) {

  listObj := &s3.ListObjectsV2Input{
    Bucket: aws.String(l.bucket),
  }

  var err error
  l.lObj, err = client.ListObjectsV2(listObj)
  if err != nil {
    return false, err
  }

  return true, nil
}

正确答案


您不应传递对 s3.s3 结构的引用。使用 aws sdk for go v1 时,您通常会传递服务相应的接口。对于 s3,这是 s3iface

您的函数的签名如下所示:

func (l *listcontentimp) lists3content(client s3iface.s3api) (bool, error)

现在,您传递的每个至少实现 s3iface.s3api 方法之一的结构都将起作用。

在运行时,您将传递适当的服务客户端,但在单元测试中,您可以只传递模拟:

type mock struct {
    s3iface.s3api

    output *s3.listobjectsv2output
    err     error
}

func (m mock) listobjectsv2(*s3.listobjectsv2input) (*s3.listobjectsv2output, error) {
    return m.output, m.err
}

在您的测试中,您创建模拟并将其传递给您的函数:

func Test_ListObject(t *testing.T) {
    l := &listContentImp{...}
    m := mock{
        output: &s3.ListObjectsV2Output{...},
        err: nil
    }

    result, err := l.ListS3Content(m)
    
    [... add checks here...]
}

本篇关于《使用 Golang 中 s3.S3 对象进行单元测试》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

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