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)
}
但僅僅因為你可以并不意味著你應該。
我認為在大多數情況下,將字段更改為導出或使用模擬會更好,但如果由于某種原因這些不是選項,這會為您提供另一種選擇。

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()。

TA貢獻1815條經驗 獲得超10個贊
沒有直接的方法可以實現這一點。您有多種選擇來實現類似的目標,所有這些都有自己的權衡。由您決定哪種權衡最適合您的情況。
一般來說,我會按以下順序嘗試:
使包
config
依賴于接口而不是結構GitFetcher
。這樣你就可以GitFetcher
在你的測試中模擬。添加一個額外的工廠方法,專門用于可以
GitFetcher
更容易構建的測試。將未導出的字段導出。
簡單地組合包。這樣您就可以訪問測試中兩個對象的未導出字段。
- 4 回答
- 0 關注
- 152 瀏覽
添加回答
舉報