unit-testing - 使用 *s3.S3 对象进行 Golang 单元测试

标签 unit-testing go

我应该如何对以下代码进行单元测试。我试图使用 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 时,您通常会传递服务相应的接口(interface)。对于 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...]
}

关于unit-testing - 使用 *s3.S3 对象进行 Golang 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71478975/

相关文章:

postgresql - 复合唯一键的 Gorm 标签

XML Marshal 在此 Go 示例中不起作用

unit-testing - 测试函数 : what more should be tested?

python-2.7 - 测试期间无法禁用WTF CSRF保护

mysql - Golang MySQL 错误 - packets.go :33: unexpected EOF

mongodb - 定义ID int64时如何自动生成ID int64 `bson:“_id”`

c# - 为什么 Moq 抛出 "expected Invocation on the mock at least once"。在哪里设置一次,即使它被设置为空?

angular - SinonJS : calledWith() with exact object

php - 使用 --code-coverage 运行时,Mockery 失败并显示 'Could not load mock ... class already exists'

reflection - 如何使用反射实现或模拟Go接口(interface)?