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