Function 将函数传递给助手方法

Function 将函数传递给助手方法,function,loops,go,Function,Loops,Go,在Go中是否可以迭代一组函数 我的单元测试文件中有此帮助器方法: func助手(t*testing.t,f func(string)bool,stringArray[]string,预期bool){ 对于u,输入:=范围字符串数组{ 如果f(输入)!=预期值{ t、 Errorf(“字符串%v应为'%v',!应为输入) } } } 而不是像这样复制/粘贴一行并更改第二行: func Test_isUnique(t *testing.T) { var valid = []string{"

在Go中是否可以迭代一组函数

我的单元测试文件中有此帮助器方法:

func助手(t*testing.t,f func(string)bool,stringArray[]string,预期bool){
对于u,输入:=范围字符串数组{
如果f(输入)!=预期值{
t、 Errorf(“字符串%v应为'%v',!应为输入)
}
}
}
而不是像这样复制/粘贴一行并更改第二行:

func Test_isUnique(t *testing.T) {
    var valid = []string{"", "b", "ab", "acd", "asdfjkl", "aA"}
    var invalid = []string{"aa", "avva", "aaa", "asdfweryhfda", "asdfjkal"}
    helper(t, funcA, valid, true)
    helper(t, funcB, invalid, false)
    helper(t, funcC, valid, true)
    helper(t, funcD, invalid, false)
    helper(t, funcE, valid, true)
    helper(t, funcF, invalid, false)
    helper(t, funcG, valid, true)
    helper(t, funcH, invalid, false)
}
相反,我想知道这里是否有一个for选项,可以将其简化为4行体函数

  for f in [funcA, funcB, funcB, funcC, funcD, etc]: // Fix this
    helper(t, f, valid, true)
    helper(t, f, invalid, false)

请原谅python/go-over:)

是的,这是可能的。例如,您可以在任何切片上进行范围设置,包括元素类型为函数类型的切片。只需将函数放入一个切片中:

fs := []func(string) bool{funcA, funcB, funcC, funcD, ...}

for _, f := range fs {
    helper(t, f, valid, true)
    helper(t, f, invalid, false)
}

同样,对于您试图实现的目标,表驱动测试可能更合适。请检查,还有。

是的,有可能。例如,您可以在任何切片上进行范围设置,包括元素类型为函数类型的切片。只需将函数放入一个切片中:

fs := []func(string) bool{funcA, funcB, funcC, funcD, ...}

for _, f := range fs {
    helper(t, f, valid, true)
    helper(t, f, invalid, false)
}

同样,对于您试图实现的目标,表驱动测试可能更合适。请检查,还有。

惯用的方法是使用表驱动测试:

func TestMyFunction(t*testing.t){
有效:=[]字符串{”,“b”,“ab”,“acd”,“asdfjkl”,“aA”}
案例:=[]结构{
名称字符串,
f func(字符串)布尔
输入[]字符串
期望布尔
}{
{
“测试函数a”,
芬卡,
有效,
真的
},
//其他测试用例
}
对于u,tc:=范围案例{
t、 运行(tc.name,func(t*testing.t){
帮助程序(t,tc.func,tc.input,tc.expected)
})
}
}
作为旁注:您实际上可以使用该函数显式地标记helper函数。这可确保在运行测试时从打印的行信息中排除助手函数:

func助手(t*testing.t){
t、 助手()
//助手函数代码
}

惯用的方法是使用表驱动测试:

func TestMyFunction(t*testing.t){
有效:=[]字符串{”,“b”,“ab”,“acd”,“asdfjkl”,“aA”}
案例:=[]结构{
名称字符串,
f func(字符串)布尔
输入[]字符串
期望布尔
}{
{
“测试函数a”,
芬卡,
有效,
真的
},
//其他测试用例
}
对于u,tc:=范围案例{
t、 运行(tc.name,func(t*testing.t){
帮助程序(t,tc.func,tc.input,tc.expected)
})
}
}
作为旁注:您实际上可以使用该函数显式地标记helper函数。这可确保在运行测试时从打印的行信息中排除助手函数:

func助手(t*testing.t){
t、 助手()
//助手函数代码
}

谢谢。发现它也可以嵌套在范围块中,不需要声明变量。谢谢。发现它也可以嵌套在范围块中,不需要声明变量。谢谢。这就是vscode自动生成存根的目的。我发现它有点太多了,但如果它是Go中的标准,那么我最好习惯:)我刚刚注意到上面的问题是,子测试不是在valid中的每个元素上运行,而是只在上面的每个“测试用例”上运行。获得这样的感觉:要么删除有效数组并为每个元素创建一个“测试用例”,要么将子测试放在我的helper方法中,对我的有效元素进行迭代。在Go中,正确的方法是什么?是的,每个测试用例现在确实检查一个数组。这实际上取决于函数在做什么。考虑到函数接受字符串,我建议使用单元素方法。谢谢。这就是vscode自动生成存根的目的。我发现它有点太多了,但如果它是Go中的标准,那么我最好习惯:)我刚刚注意到上面的问题是,子测试不是在valid中的每个元素上运行,而是只在上面的每个“测试用例”上运行。获得这样的感觉:要么删除有效数组并为每个元素创建一个“测试用例”,要么将子测试放在我的helper方法中,对我的有效元素进行迭代。在Go中,正确的方法是什么?是的,每个测试用例现在确实检查一个数组。这实际上取决于函数在做什么。鉴于函数接受字符串,我建议使用单元素方法。