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

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

如何存根對 GitHub 的調(diào)用以進(jìn)行測試?

如何存根對 GitHub 的調(diào)用以進(jìn)行測試?

Go
小唯快跑啊 2022-10-04 16:36:58
我需要使用go-github創(chuàng)建一個(gè)拉取請求注釋,我的代碼可以工作,但現(xiàn)在我想為它編寫測試(是的,我知道測試應(yīng)該放在第一位),這樣我就不會(huì)在測試期間實(shí)際調(diào)用真正的GitHub服務(wù)。我已經(jīng)閱讀了3篇關(guān)于golang茬蟄和嘲笑的博客,但是,作為golang的新手,盡管對go-github問題進(jìn)行了討論,但我還是有點(diǎn)迷茫。例如,我編寫了以下函數(shù):// this is my functionfunc GetClient(token string, url string) (*github.Client, context.Context, error) {    ctx := context.Background()    ts := oauth2.StaticTokenSource(        &oauth2.Token{AccessToken: token},    )    tc := oauth2.NewClient(ctx, ts)    client, err := github.NewEnterpriseClient(url, url, tc)    if err != nil {        fmt.Printf("error creating github client: %q", err)        return nil, nil, err    }    return client, ctx, nil}我怎么能存根呢?同樣,我有這個(gè):func GetPRComments(ctx context.Context, client *github.Client) ([]*github.IssueComment, *github.Response, error)  {    opts := &github.IssueListCommentsOptions{        ListOptions: github.ListOptions{            Page:    1,            PerPage: 30,        },    }    githubPrNumber, err := strconv.Atoi(os.Getenv("GITHUB_PR_NUMBER"))    if err != nil || githubPrNumber == 0 {      panic("error: GITHUB_PR_NUMBER is not numeric or empty")    }    // use Issues API for PR comments since GitHub docs say "This may seem counterintuitive... but a...Pull Request is just an Issue with code"    comments, response, err := client.Issues.ListComments(          ctx,          os.Getenv("GITHUB_OWNER"),          os.Getenv("GITHUB_REPO"),          githubPrNumber,          opts)    if err != nil {        return nil, nil, err    }    return comments, response, nil}我應(yīng)該如何存根?我的想法是也許通過首先創(chuàng)建自己的結(jié)構(gòu)來使用依賴注入,但我不確定如何,所以目前我有這個(gè):func TestGetClient(t *testing.T) {    client, ctx, err := GetClient(os.Getenv("GITHUB_TOKEN"), "https://example.com/api/v3/")    c, r, err := GetPRComments(ctx, client)    ...}
查看完整描述

1 回答

?
小怪獸愛吃肉

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

我會(huì)從一個(gè)界面開始:


type ClientProvider interface {

  GetClient(token string, url string) (*github.Client, context.Context, error)

}

測試需要調(diào)用的單元時(shí),請確保依賴于接口:GetClientClientProvider


func YourFunctionThatNeedsAClient(clientProvider ClientProvider) error {

  // build you token and url


  // get a github client

  client, ctx, err := clientProvider.GetClient(token, url)

  

  // do stuff with the client


  return nil

}

現(xiàn)在,在您的測試中,您可以構(gòu)造如下存根:


// A mock/stub client provider, set the client func in your test to mock the behavior

type MockClientProvider struct {

  GetClientFunc func(string, string) (*github.Client, context.Context, error)

}


// This will establish for the compiler that MockClientProvider can be used as the interface you created

func (provider *MockClientProvider) GetClient(token string, url string) (*github.Client, context.Context, error) {

  return provider.GetClientFunc(token, url)

}


// Your unit test

func TestYourFunctionThatNeedsAClient(t *testing.T) {

  mockGetClientFunc := func(token string, url string) (*github.Client, context.Context, error) {

    // do your setup here

    return nil, nil, nil // return something better than this

  }


  mockClientProvider := &MockClientProvider{GetClientFunc: mockGetClientFunc}


  // Run your test

  err := YourFunctionThatNeedsAClient(mockClientProvider)


  // Assert your result

}

這些想法不是我自己的,我從我之前的人那里借來的。Mat Ryer在一個(gè)關(guān)于“慣用語golang”的精彩視頻中提出了這個(gè)(和其他想法)。


如果要存根 github 客戶端本身,可以使用類似的方法(如果是 github)??蛻舳耸且粋€(gè)結(jié)構(gòu),你可以用一個(gè)接口來隱藏它。如果它已經(jīng)是一個(gè)接口,則上述方法直接起作用。


查看完整回答
反對 回復(fù) 2022-10-04
  • 1 回答
  • 0 關(guān)注
  • 110 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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