如何模擬在包init()方法中呼叫的東西?
例如:
main.go
var myService MyService = myservicepkg.New()
func init(){
response := myService.get()
}
func otherMethod(){
//do something
}
maintest.go
func Test_otherMethod(){
ctrl := NewController(t)
defer ctrl.Finish()
myServiceMock = myservicepkg.NewMock(myService)
myServiceMock.EXPECT().get().return("success")
}
問題是init()在服務被模擬替換之前呼叫。
uj5u.com熱心網友回復:
你需要打電話給otherMethod()里面init()。否則之前不能呼叫它init()。
uj5u.com熱心網友回復:
我找到了一種解決方法,您可以阻止在您的測驗中執行初始化代碼并像這樣單獨測驗該方法:
func init(){
if strings.HasSuffix(os.Args[0], ".test") {
log.Printf("skipping init() for testing")
} else if strings.HasSuffix(os.Args[1], "-test") {
log.Printf("skipping init() for testing")
} else {
response := myService.get()
}
}
這將防止呼叫初始化服務呼叫。
uj5u.com熱心網友回復:
這是使用可變全域狀態作業的問題。
我的建議是添加一個標志以在某些條件下不運行它或公開一個可以在內部測驗中恢復/更新此全域變數的私有函式。
這反映了您的設計:如果測驗很復雜,也許您應該重構。
創建一個帶有現場服務的物件應用程式,在建構式/構建器/工廠上創建將更容易測驗。
init 的使用非常微妙。除了將驅動程式注冊到 sql 包中,我從不使用它(也許是為了處理標志)。
也許你可以在你的設計中添加更多的面向物件
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/447717.html
