我是一位經驗豐富的程式設計師,但對 go 來說還是個新手。我正在編寫一些日誌記錄測試,出於這些目的,我產生了 logsink
類別的模擬(使用 mockgen
)。由於該部分都是自動生成的,我認為我們可以假設那裡沒有任何問題。
這是我的測試程式碼:
func TestLogging(t *testing.T) { ls := mock.NewMockLogSink(gomock.NewController(t)) ls.EXPECT().Init(gomock.Any()) const logLevel = 1 ls.EXPECT().Enabled(gomock.Any()).AnyTimes().Do(func(level int) bool { return level <= logLevel }) log.Set(logr.New(ls)) ls.EXPECT().Info(gomock.Any(), "Foo").Times(1) log.Info("Foo") ls.EXPECT().Info(gomock.Any(), "Bar").Times(0) log.V(2).Info("Bar") }
但是這個測試失敗了,因為「foo」日誌永遠不會被呼叫。我單步執行程式碼,發現我的expect().do()
程式碼按預期被調用,並返回true
,但在模擬程式碼中,它將logger .sink.enabled()
的結果視為false
!
我做錯了什麼?我是否缺少一個秘密開關?
好吧,事實證明 .do()
故意忽略傳回值。這是程式碼中的文件:
// Do declares the action to run when the call is matched. The function's // return values are ignored to retain backward compatibility. To use the // return values call DoAndReturn.
向後相容性。正確的。公共領域的血腥坑,如果你問我...
以上是Gomock 未回傳預期值的詳細內容。更多資訊請關注PHP中文網其他相關文章!