Go でのリフレクションを使用した関数のコレクションのテスト
問題
セットの単体テスト同様のシグネチャと戻り値を持つ関数を複数使用すると、反復的で煩雑になる可能性があります。従来のアプローチでは、関数ごとに個別のテストを作成する必要があるため、コードの重複が発生する可能性があります。 Reflection は、このプロセスを合理化するソリューションを提供します。
Reflection を使用したソリューション
テストでリフレクションを活用するには:
コード例
<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 中国語 Web サイトの他の関連記事を参照してください。