3 回答

TA貢獻1845條經驗 獲得超8個贊
這不是直接回答你的問題,但它可能會完全消除問題的基礎。
Go 中的一個巧妙之處在于,您可以使用接口輕松地隔離依賴項。如果您的代碼,即您需要測試的部分,正在Presign間接使用,那么測試就很簡單了。
即創建一個界面
type HigherLevelAws interface {
Upload(file string) error
}
并在您的代碼中使用此接口以及Upload. 然后您可以使用例如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)對此進行測試。

TA貢獻1869條經驗 獲得超4個贊
我不得不模擬 S3 命令的請求。代碼如下:
req, result := r.s3.ListObjectsV2Request(&s3.ListObjectsV2Input{
Bucket: aws.String(configs.Settings.S3Bucket),
})
err := req.Send()
Mock 函數必須返回一個請求對象
func (m *mockS3ProviderClient) ListObjectsV2Request(input *s3.ListObjectsV2Input) (req *request.Request, output *s3.ListObjectsV2Output) {
err := input.Validate()
req = &request.Request{
HTTPRequest: &http.Request{},
Error: err,
}
output = &s3.ListObjectsV2Output{
Contents: []*s3.Object{
{Key:aws.String("File1")},
{Key:aws.String("File2")},
},
}
return req, output
}

TA貢獻1831條經驗 獲得超4個贊
您可以直接為該函數創建一個接口,如下所示:
type presigner interface {
Presign(expire time.Duration) (string, error)
}
如果您在一個單獨的函數中實現您的邏輯,該函數將 apresigner作為參數,如下所示(稱為依賴注入):
func Upload(p presigner, files string) error {
// ...
res, err := p.Presign(someduration)
if err != nil {
return err
}
// and so on
}
然后很容易在你的測試中模擬 - 只需實現presigner接口并讓Presign函數返回你所期望的:
type presignerMock struct {}
func (p *presignerMock) Presign(d time.Duration) (string, error) {
return "yay", nil
}
要測試不同的場景,您可以向 中添加字段presignerMock并在您的實現中返回它們:
type presignerMock {
res string
err error
}
func (p *presignerMock) Presign(d time.Duration) (string, error) {
return p.res, p.err
}
- 3 回答
- 0 關注
- 183 瀏覽
添加回答
舉報