2 回答

TA貢獻1853條經驗 獲得超9個贊
問題 1:為了在 Golang 中編寫單元測試,為什么我們需要模擬方法的接口,為什么不只是 struct ?
答:不是強制性的
問題 2:為什么我們在 struct 中注入接口(我們調用外部方法)
回答:因為,它可以幫助您通過注入a MockStruct
(實現(xiàn)interface
與是否存在于實際代碼中)。簡單的多態(tài)性。
所以,你創(chuàng)建一個MockStruct
并定義你自己mockMethods
的。作為多態(tài)性,您的單元測試選擇MockStruct
沒有抱怨。調用實際的數(shù)據(jù)庫或http
端點不屬于單元測試。
僅供參考,我可以將您指向我的一個 github 代碼庫,在那里我為一個文件編寫了一個小測試用例。如您所見,我嘲笑:
GuestCartHandler
interface,這使我可以不調用實際的實現(xiàn)使用包模擬
sql
連接。"github.com/DATA-DOG/go-sqlmock"
這幫助我避免建立實際db client
的(因此,在單元測試時不依賴數(shù)據(jù)庫)
如果您從概念上理解這個想法,或者您是否需要更多說明,請告訴我。

TA貢獻2003條經驗 獲得超2個贊
如果你有關于包用戶類型的方法,比如說,ex。包用戶
type User struct {
name string
}
func (u *User) GetUserProfile() UserProfile{}
現(xiàn)在在目錄包中導入:
package catalog
import user
func getUserCatalog(user user.User) []catalog {
user.GetUserProfile()
}
現(xiàn)在測試 getUserCatalog 方法有兩種方法:
1. var getUserProfileFunc = user.GetUserProfile
使用這種方法模擬可以在測試運行時輕松通過,例如:
getUserProfile = func() UserProfile {
return fakeUserProfile
}
這是測試它的最簡單方法。
現(xiàn)在還有另一種使用接口的方法,在包用戶中添加一個接口,如
type UserInterface interface {
GetUserProfile() UserProfile
}
如果用戶包是您無法控制的庫,則創(chuàng)建自己的界面,鍵入并使用它。
在這種情況下,目錄包中的測試將變?yōu)椋?/p>
因為現(xiàn)在方法將從 UserInterface 類型而不是從 UserType 調用,因此在測試時:
UserInterface = fakeUserStruct
并按照以下步驟
//1. define type of func to return
type typeGetUserProfile func() UserProfile
//2. create a var to return
var mockedGetUserProfile typeGetUserProfile
//3. create a type
type FakeUser struct{}
//4. implement method interface
func (user *FakeUserStruct) GetUserProfile() UserProfile{
return mockedGetUserProfile
}
現(xiàn)在運行測試時:
mockerGetUserProfile = func() UserProfile {
return fakeUserProfile
}
有一個模擬庫可以幫助創(chuàng)建用于模擬的樣板代碼。檢查這個https://github.com/stretchr/testify
還有很多其他的模擬庫,但我用過這個,這真的很酷。
我希望這有幫助。
如果沒有請告訴我,我會給出一些示例代碼并將其推送到 Github。
另請檢查https://levelup.gitconnected.com/utilizing-the-power-of-interfaces-when-mocking-and-testing-external-apis-in-golang-1178b0db5a32
- 2 回答
- 0 關注
- 116 瀏覽
添加回答
舉報