我们正在集思广益,讨论使用表驱动测试测试通用函数的可能方法。乍一看似乎很复杂。
我们想要实现的是在测试表结构中有一个字段,该字段可以是泛型函数所接受的任何类型。然而,您似乎不能使用any
接口来实现这一点。
我们提出了以下解决方案:
示例函数 :
func PtrTo[T any](t T) *T {
return &t
}
示例测试:
func TestPtrTo(t *testing.T) {
string1 := "abcd"
trueVar := true
testCases := []struct {
testDescription string
input interface{}
expectedOutput interface{}
}{
{
testDescription: "string",
input: string1,
expectedOutput: &string1,
},
{
testDescription: "bool",
input: trueVar,
expectedOutput: &trueVar,
},
}
for _, testCase := range testCases {
t.Run(testCase.testDescription, func(t *testing.T) {
switch concreteTypeInput := testCase.input.(type) {
case string:
output := PtrTo(concreteTypeInput)
assert.Equal(t, testCase.expectedOutput, output)
case bool:
output := PtrTo(concreteTypeInput)
assert.Equal(t, testCase.expectedOutput, output)
default:
t.Error("Unexpected type. Please add the type to the switch case")
}
})
}
}
不过,这并不是真正的最佳选择。
你觉得这个解决方案怎么样?
你还有其他选择吗?
模板化的助手函数可以为您提供我认为您正在寻找的语义:
package main
import (
"testing"
"github.com/google/go-cmp/cmp"
)
type testCase[T any] struct {
desc string
in T
want *T
}
func ptrToTest[T any](t *testing.T, tc testCase[T]) {
t.Helper()
t.Run(tc.desc, func(t *testing.T) {
got := PtrTo(tc.in)
if diff := cmp.Diff(tc.want, got); diff != "" {
t.Fatalf("got %v, want %v", got, tc.want)
}
})
}
func TestPtrTo(t *testing.T) {
string1 := "abcd"
ptrToTest(t, testCase[string]{
desc: "string",
in: string1,
want: &string1,
})
trueVar := true
ptrToTest(t, testCase[bool]{
desc: "bool",
in: trueVar,
want: &trueVar,
})
}
话虽如此,我同意@blackgreen的观点,即PtrTo
函数太琐碎,对于这样的测试来说没有意义。希望这对更复杂的逻辑有用!