猿问

多返回值函数的表测试

我在 Go 上咬牙切齿,在深入研究表驱动测试后,我遇到了以下问题:


我有一个返回多个值的函数


// Halves an integer and and returns true if it was even or false if it was odd.

func half(n int) (int, bool) {

    h := n / 2

    e := n%2 == 0

    return h, e

}

我知道half(1)返回值应该是0, false并且half(2)它应该匹配1, true,但我似乎无法弄清楚如何将它放在桌子上。


怎么会有类似于以下内容的东西?


var halfTests = []struct {

    in  int

    out string

}{

    {1, <0, false>},

    {3, <1, true>},

}

有没有其他更惯用的方法来做到这一点?


作为参考,这里有一个类似于 FizzBuzz 函数的测试,使用表:


var fizzbuzzTests = []struct {

    in  int

    out string

}{

    {1, "1"},

    {3, "Fizz"},

    {5, "Buzz"},

    {75, "FizzBuzz"},

}


func TestFizzBuzz(t *testing.T) {

    for _, tt := range fizzbuzzTests {

        s := FizzBuzz(tt.in)

        if s != tt.out {

            t.Errorf("Fizzbuzz(%d) => %s, want %s", tt.in, s, tt.out)

        }

    }

}


幕布斯6054654
浏览 150回答 1
1回答

哆啦的时光机

只需将另一个字段添加到保存第二个返回值的结构中。例子:var halfTests = []struct {&nbsp; &nbsp; in&nbsp; &nbsp;int&nbsp; &nbsp; out1 int&nbsp; &nbsp; out2 bool}{&nbsp; &nbsp; {1, 0, false},&nbsp; &nbsp; {3, 1, true},}您的测试功能如下所示:func TestHalf(t *testing.T) {&nbsp; &nbsp; for _, tt := range halfTests {&nbsp; &nbsp; &nbsp; &nbsp; s, t := half(tt.in)&nbsp; &nbsp; &nbsp; &nbsp; if s != tt.out1 || t != tt.out2 {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t.Errorf("half(%d) => %d, %v, want %d, %v", tt.in, s, t, tt.out1, tt.out2)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}
随时随地看视频慕课网APP

相关分类

Go
我要回答