2015-09-06 42 views
4

目前我正在嘗試寫Go的TDD。然而,我堅持以下。如何驗證在Golang中是否調用特定函數

測試寫:

func TestFeatureStart(t *testing.T){ 

} 

執行測試:

func (f *Feature) Start() error { 
    cmd := exec.Command(f.Cmd) 
    cmd.Start() 
} 

一個將如何測試這個簡單的位。我想我只是想驗證exec庫是否正確說出。 (我會在Java中使用Mockito的方式)。任何人都可以幫我寫這個測試,因爲我不太確定互聯網上現有的答案是什麼意思。他們建議使用接口。

當前Feature-struct只包含一個字符串Cmd。

回答

5

你可以用接口僞造整個交易,但你也可以使用僞造的函數。在代碼:

var cmdStart = (*exec.Cmd).Start 
func (f *Feature) Start() error { 
    cmd := exec.Command(f.Cmd) 
    return cmdStart(cmd) 
} 

在測試:

called := false 
cmdStart = func(*exec.Cmd) error { called = true; return nil } 
f.Start() 
if !called { 
    t.Errorf("command didn't start") 
} 

參見:安德魯Gerrand的Testing Techniques talk

+0

這對我來說很有意義,謝謝。 我可以創建接口,但是我怎麼想象如果我想要模擬方法,就爲我的所有結構創建一個接口;因爲如何用界面解決這種情況? – Patrick

+0

接口方法可以很好地適用於已經是接口('io.Reader','json.Unmarshaler'等)的東西,或者可以成爲接口,因爲它們只有一個或兩個方法。 –

+0

如果從其他軟件包進行測試,這將不起作用; main_test包,例如。 –

相關問題