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