[英]Mocking a inner function(or even more deep) for testing in go
有沒有辦法做到這一點? 我想從另一個 function 調用中模擬 function 調用的響應。 例子
主要.go
type Crs struct {}
func (cr crs)TheFunction() error {
// Some code
_ := ToMockResponse(hello string)
return nil
}
func ToMockResponse() error {
return somerror
}
在我的測試文件中
main_test.go
func TestTheFunction(t *testing.T) {
cr = Crs{}
mockInstance = new(randomMock)
mockInstance.On("ToMockResponse").Return(nil)
err := cr.TheFunction()
assert.NoError(t, err)
}
我不確定我做的是否正確。 我想要實現的是,只要在 TheFunction 中調用它,我只想對 ToMockResponse 進行模擬響應
我已經看過並閱讀了大部分教程,但它們都顯示了來自 class 方法的模擬響應。但是沒有函數到函數 mocking 示例。 希望您能為此提供解決方案。
無需考慮您是否應該這樣做,並假設您有充分的理由這樣做,模擬函數的一種方法是通過間接級別使用它們。 然后,您可以出於測試目的在您的間接尋址中替換一個合適的替代方案。
接口是實現這一點的一種方法,但 GoLang 支持函數作為值,因此另一種方法是使用適當的 function 類型的簡單變量:
適應你的例子,這可能看起來類似於:
var toMockResponse = ToMockResponse
func (cr crs)TheFunction() error {
// Some code
_ := toMockResponse(hello string)
return nil
}
func ToMockResponse() error {
return somerror
}
和你的測試:
func TestTheFunction(t *testing.T) {
cr = Crs{}
ofn := toMockResponse
toMockResponse = func(string) error { return nil }
defer func() { toMockResponse = ofn }()
err := cr.TheFunction()
assert.NoError(t, err)
}
我假設您需要導出ToMockResponse
; 故意不導出 function 變量,以便不能在 package 本身之外對其進行操作。
如果被重定向的 function本身沒有導出,拒絕使用導出符號與未導出符號的大小寫差異來區分它們的能力,那么您可能需要在命名時更有創意一些。 例如,一個名為toMockResponseFn
的變量。
ofn
是“原始函數”的助記符。 在更復雜的測試中,您可以通過為您需要的每個創建一個ofn
來保留模式( defer
操作 w.r.t 包含 function,而不是范圍):
{
ofn := toMockResponse
toMockResponse = func(string) error { return nil }
defer func() { toMockResponse = ofn }()
}
{
ofn := now
now = func() time.Time { return time.Date(..etc..) }
defer func() { now = ofn }()
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.