第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何在 golang 中模擬 request.Request

如何在 golang 中模擬 request.Request

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

3 回答

?
精慕HU

TA貢獻(xiàn)1845條經(jīng)驗(yàn) 獲得超8個(gè)贊

這不是直接回答你的問題,但它可能會(huì)完全消除問題的基礎(chǔ)。


Go 中的一個(gè)巧妙之處在于,您可以使用接口輕松地隔離依賴項(xiàng)。如果您的代碼,即您需要測試的部分,正在Presign間接使用,那么測試就很簡單了。


即創(chuàng)建一個(gè)界面


type HigherLevelAws interface {

    Upload(file string) error

}

并在您的代碼中使用此接口以及Upload. 然后您可以使用例如https://godoc.org/github.com/stretchr/testify/mock輕松模擬它


實(shí)際的實(shí)現(xiàn)看起來像這樣


type ActualAwsImpl struct {

    aws *aws.Client

}


func (a *ActualAwsImpl) Upload(file string) error {

    aws.Presign...

}

這允許您測試代碼的業(yè)務(wù)部分,但當(dāng)然,仍然會(huì)在ActualAwsImpl. 然而,這些未經(jīng)測試的代碼可以通過 aws sdk 本身的單元和集成測試來保證工作。無論哪種方式,在我的組織中,我們使用在 docker 中運(yùn)行的假 aws 服務(wù)(例如https://github.com/gliffy/fake-s3)對此進(jìn)行測試。


查看完整回答
反對 回復(fù) 2023-06-01
?
MMTTMM

TA貢獻(xiàn)1869條經(jīng)驗(yàn) 獲得超4個(gè)贊

我不得不模擬 S3 命令的請求。代碼如下:


req, result := r.s3.ListObjectsV2Request(&s3.ListObjectsV2Input{

        Bucket: aws.String(configs.Settings.S3Bucket),

    })


    err := req.Send()

Mock 函數(shù)必須返回一個(gè)請求對象


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

}


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

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超4個(gè)贊

您可以直接為該函數(shù)創(chuàng)建一個(gè)接口,如下所示:


type presigner interface {

    Presign(expire time.Duration) (string, error)

}

如果您在一個(gè)單獨(dú)的函數(shù)中實(shí)現(xiàn)您的邏輯,該函數(shù)將 apresigner作為參數(shù),如下所示(稱為依賴注入):


func Upload(p presigner, files string) error {

    // ...

    res, err := p.Presign(someduration)

    if err != nil {

        return err

    }

    // and so on

}

然后很容易在你的測試中模擬 - 只需實(shí)現(xiàn)presigner接口并讓Presign函數(shù)返回你所期望的:


type presignerMock struct {}


func (p *presignerMock) Presign(d time.Duration) (string, error) {

    return "yay", nil

}

要測試不同的場景,您可以向 中添加字段presignerMock并在您的實(shí)現(xiàn)中返回它們:


type presignerMock {

    res string

    err error

}


func (p *presignerMock) Presign(d time.Duration) (string, error) {

    return p.res, p.err

}


查看完整回答
反對 回復(fù) 2023-06-01
  • 3 回答
  • 0 關(guān)注
  • 205 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號