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

Golang unittest with *s3.S3 object

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

您不应传递对 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...]
}