是否使用闭包?这是编写此测试功能的更好方法

时间:2019-05-02 23:37:13

标签: go

我不确定我是否正确地命名了问题,如果不是,我是否愿意进行修改。

我有这样的测试:

func TestMyStruct(t *testing.T) {
    tests := []struct {
        testcase string
        setup    func()
    }{
        testcase: "test1",
        setup: func() {
          // if setup fail, call t.Fatal()
          t.Fatal()
        },
    }

    for _, test := range tests {
        t.Run(test.testcase, func(t *testing.T) {
            // setup:
            test.setup()

            // action:

            // assertions:
        })
    }
}

我可以用另一种方式编写,将t传递给内部设置函数:

func TestMyStruct(t *testing.T) {
        tests := []struct {
            testcase string
            setup    func(t *testing.T)
        }{
            testcase: "test1",
            setup: func(t *testing.T) {
               // if setup fail, call t.Fatal()
               t.Fatal()
            },
        }

        for _, test := range tests {
            t.Run(test.testcase, func(t *testing.T) {
                // setup:
                test.setup(t)

                // action:

                // assertions:
            })
        }
    }

我的问题是首选哪种方法,为什么?

1 个答案:

答案 0 :(得分:1)

在设置函数中的第一个示例t中,是指传递给TestMyStruct的主要测试。

在第二个示例中,setup函数中的t引用了它自己的t参数,该参数作为子测试从t.Run传递。

这是不同的,它取决于您要失败的测试是主测试还是子测试。

[扩展@Peter的评论并标记为社区Wiki]