在Go 中使用反射測試一組函數
問題
對集合單元測試具有相似簽名和返回值的函數可能會變得重複且麻煩。傳統方法涉及為每個函數編寫單獨的測試,這可能會導致程式碼重複。反射提供了一個簡化此過程的解決方案。
使用反射的解決方案
要在測試中利用反射:
範例程式碼
<code class="go">var funcNames = []string{"Func1", "Func2", "Func3"} func TestFunc(t *testing.T) { stype := reflect.ValueOf(s) for _, fname := range funcNames { fmt.Println(fname) sfunc := stype.MethodByName(fname) ret := sfunc.Call([]reflect.Value{}) val := ret[0].Int() if val < 1 { t.Error(fname + " should return positive value") } if !ret[1].IsNil() { t.Error(fname + " shouldn't err") } } }</code>
注意:如果無效指定了函數名,測試將會出現恐慌。為了緩解這種情況:
<code class="go">for _, fname := range funcNames { defer func() { if x := recover(); x != nil { t.Error("TestFunc paniced for", fname, ": ", x) } }() fmt.Println(fname) }</code>
以上是反射如何簡化 Go 中具有相似簽名的函數的單元測試?的詳細內容。更多資訊請關注PHP中文網其他相關文章!