簡體   English   中英

Mocking 用於在 go 中進行測試的內部函數(或更深)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM