为了账号安全,请及时绑定邮箱和手机立即绑定

带有 *s3.S3 对象的 Golang 单元测试

带有 *s3.S3 对象的 Golang 单元测试

Go
隔江千里 2022-11-23 14:15:11

我应该如何对以下代码进行单元测试。我试图使用 coutnerfiter 伪造输入“*s3.S3”对象,但它对我不起作用。我是 coutnerfiter 和 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

}


查看完整描述

1 回答

?
呼唤远方

TA贡献1559条经验 获得超11个赞

您不应该传递对该s3.S3结构的引用。使用适用于 Go v1 的 AWS 开发工具包时,您通常会传递相应的服务接口。对于 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...]

}


查看完整回答
反对 回复 5天前

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信