首页 > 解决方案 > 是否使用闭包?这是编写此测试功能的更好方法

问题描述

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

我有一个这样的测试:

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:
            })
        }
    }

我的问题是首选哪种方式以及为什么。

标签: go

解决方案


在第一个示例t中, setup 函数是指传递给TestMyStruct.

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

这些是不同的,这取决于您想要失败的测试 - 主测试或子测试。

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


推荐阅读