亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 golang 中模擬 request.Request

如何在 golang 中模擬 request.Request

Go
catspeake 2023-06-01 17:22:39
我正在使用github.com/aws/aws-sdk-go/aws/request獲取預簽名 URL,我需要將文件上傳到 AWS 中的 s3 存儲桶。我目前正在編寫測試,為此我需要模擬func (r *Request) Presign(expire time.Duration). request.Request是一個結構,而不是一個接口,所以我不知道,我怎么能模擬它。
查看完整描述

3 回答

?
精慕HU

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)對此進行測試。


查看完整回答
反對 回復 2023-06-01
?
MMTTMM

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

}


查看完整回答
反對 回復 2023-06-01
?
慕容708150

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

}


查看完整回答
反對 回復 2023-06-01
  • 3 回答
  • 0 關注
  • 183 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號