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

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

為什么我們使用接口來模擬 Golang 方法

為什么我們使用接口來模擬 Golang 方法

Go
慕娘9325324 2022-06-21 16:59:33
我是 Golang 的新手,一直在探索但不清楚單元測試中的模擬。誰能解釋以下具體問題?問題1:在 Golang 中編寫單元測試,為什么我們需要有接口來模擬方法,為什么不只有 struct ?問題2:為什么我們在結構中注入接口(我們稱之為外部方法)使用結構 -type GlobalData struct {}var (    GlobalObj = GlobalData{})func (g GlobalData) GetGlobalData(a string) string{    return a}帶有接口定義-type GlobalInterface interface {    GetGlobalData(a string) string}type GlobalData struct {}var (    GlobalObj = GlobalData{})func (g GlobalData) GetGlobalData(a string) string{    return a}謝謝
查看完整描述

2 回答

?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

問題 1:為了在 Golang 中編寫單元測試,為什么我們需要模擬方法的接口,為什么不只是 struct ?

答:不是強制性的

問題 2:為什么我們在 struct 中注入接口(我們調用外部方法)

回答:因為,它可以幫助您通過注入MockStruct(實現(xiàn)interface與是否存在于實際代碼中)。簡單的多態(tài)性。

所以,你創(chuàng)建一個MockStruct并定義你自己mockMethods的。作為多態(tài)性,您的單元測試選擇MockStruct沒有抱怨。調用實際的數(shù)據(jù)庫或http端點不屬于單元測試

僅供參考,我可以將您指向我的一個 github 代碼庫,在那里我為一個文件編寫了一個小測試用例。如您所見,我嘲笑:

  1. GuestCartHandlerinterface,這使我可以不調用實際的實現(xiàn)

  2. 使用包模擬sql連接。"github.com/DATA-DOG/go-sqlmock"這幫助我避免建立實際db client的(因此,在單元測試時不依賴數(shù)據(jù)庫)

如果您從概念上理解這個想法,或者您是否需要更多說明,請告訴我。


查看完整回答
反對 回復 2022-06-21
?
湖上湖

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


查看完整回答
反對 回復 2022-06-21
  • 2 回答
  • 0 關注
  • 116 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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