我正在使用 github.com/aws/aws-sdk-go/aws/request 来获取预签名 URL,我需要将其上传到 AWS 中的 s3 存储桶。我目前正在编写测试,因此我需要模拟 func (r *Request) Presign(expire time.Duration) 。 request.Request
是一个结构,而不是一个接口(interface),所以我不知道如何模拟它。
最佳答案
这并没有直接回答您的问题,但它可能会完全消除问题的基础。
Go 中的一个巧妙之处是,您可以使用接口(interface)轻松隔离依赖项。如果您的代码(需要测试的部分)间接使用 Presign
,则测试起来很简单。
即创建一个界面
type HigherLevelAws interface {
Upload(file string) error
}
并在代码中使用此接口(interface)以及上传
。然后你可以使用例如轻松地模拟它https://godoc.org/github.com/stretchr/testify/mock
实际的实现,看起来像这样
type ActualAwsImpl struct {
aws *aws.Client
}
func (a *ActualAwsImpl) Upload(file string) error {
aws.Presign...
}
这允许您测试代码的业务部分,但当然,仍然会在 ActualAwsImpl
中留下未经测试的代码。然而,这些未经测试的代码可以通过 aws sdk 本身中的单元和集成测试来保证正常工作。
不管怎样,在我的组织中,我们使用在 docker 中运行的假 aws 服务来测试这一点(例如 https://github.com/gliffy/fake-s3 )。
关于amazon-web-services - 如何在golang中模拟request.Request,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54285068/