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

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

如何在不同的包中測試未導出的結構字段?

如何在不同的包中測試未導出的結構字段?

Go
catspeake 2023-03-21 16:57:18
我有一個用工廠創(chuàng)建對象的包。這些結構具有未導出的字段,例如:package fetchertype GitFetcher struct {    uri    string}我有另一個包,它解析一些配置文件,然后構建另一個使用上述對象的對象:package configtype Source struct {    fetcher    GitFetcher}我正在嘗試測試我的config包裹。我想構建一些預期的對象,但由于我的測試正在進行config并且我的測試GitFetcher正在進行中,fetcher我不能只創(chuàng)建我想要的對象,例如:package configexpected := GitFetcher{    uri: "example.com/repo.git"      // doesn't work. Field isn't exported.}我如何跨包構建對象以進行這樣的測試?我不想使用fetcher工廠方法,因為它采用的參數并不簡單。
查看完整描述

4 回答

?
蝴蝶刀刀

TA貢獻1801條經驗 獲得超8個贊

絕對可以用未導出的字段測試結構。


它很笨拙,但你可以使用fmt.Sprint().


func isExpectedStruct(myStruct *otherPak.MyStruct) bool {

    expectedStr := "&{1 2}"

    str := fmt.Sprint(myStruct)


    return expectedStr == str

}

或者


如果你只想測試一個特定的領域


func isExpectedField(myStruct *otherPak.MyStruct) bool {

    expectedSubStr := "unexportedField:2"

    str := fmt.Sprintf("%+v", myStruct)

    return strings.Contains(str, expectedSubStr)

}

但僅僅因為你可以并不意味著你應該。


我認為在大多數情況下,將字段更改為導出或使用模擬會更好,但如果由于某種原因這些不是選項,這會為您提供另一種選擇。


查看完整回答
反對 回復 2023-03-21
?
牛魔王的故事

TA貢獻1830條經驗 獲得超3個贊

如果您沒有太多需要測試的屬性,那么一種(hacky?)方法是為該屬性創(chuàng)建一個 getter 函數。


例如,在包中創(chuàng)建這樣的東西:


func (g *gitFetcher) GetUri() string {

    return g.uri

}

在你的模擬中,你可以擁有


type GitFetcherMock struct {

    mock.Mock

}


func (g *GitFetcherMock) GetUri() string {

    args := g.Called()

    return args.Get(0)

并且您可以在實際代碼中使用實際 URI 的任何地方傳入 GetUri()。


查看完整回答
反對 回復 2023-03-21
?
一只甜甜圈

TA貢獻1836條經驗 獲得超5個贊

如何測試未導出的 [...] 不同的包?

一點也不。不可撤銷,請勿嘗試。

(如果未導出的東西有一個導出的方法,那么你可以調用這個方法。)


查看完整回答
反對 回復 2023-03-21
?
動漫人物

TA貢獻1815條經驗 獲得超10個贊

沒有直接的方法可以實現這一點。您有多種選擇來實現類似的目標,所有這些都有自己的權衡。由您決定哪種權衡最適合您的情況。

一般來說,我會按以下順序嘗試:

  1. 使包config依賴于接口而不是結構GitFetcher。這樣你就可以GitFetcher在你的測試中模擬。

  2. 添加一個額外的工廠方法,專門用于可以GitFetcher更容易構建的測試。

  3. 將未導出的字段導出。

  4. 簡單地組合包。這樣您就可以訪問測試中兩個對象的未導出字段。


查看完整回答
反對 回復 2023-03-21
  • 4 回答
  • 0 關注
  • 152 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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