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

我应该如何对以下代码进行单元测试。我试图使用 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

}


隔江千里
浏览 70回答 1
1回答

呼唤远方

您不应该传递对该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...]}
打开App,查看更多内容
随时随地看视频慕课网APP