在 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中文网其他相关文章!