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:
})
}
}
我的问题是首选哪种方式以及为什么。
解决方案
在第一个示例t
中, setup 函数是指传递给TestMyStruct
.
在 setup 函数内部的第二个示例t
中,它引用了它自己的t
参数,该参数作为子测试从t.Run
.
这些是不同的,这取决于您想要失败的测试 - 主测试或子测试。
[扩展@Peter 的评论并标记为社区 wiki]
推荐阅读
- javascript - 设置 Javascript 音频对象的 MIME 类型
- c++ - 在命名返回值上使用 std::move 来保证不复制?
- javascript - 我的图像直到我的幻灯片放映后才显示,然后当幻灯片再次开始时,它消失了
- linux - 投屏时屏幕闪烁 | ArchLinux 和 Manjaro
- architecture - 我应该按什么顺序开发我的 N-Tier 应用程序?
- jquery - 动态导航栏偏移()。顶部数值不起作用
- php - 使用简单的 html dom 解析器从解析的 html 中删除脚本标签
- c - 在 DEV-C++ 中调试
- python-3.x - 从日期和时间获取日期时间
- json - Python 多级 Json 到 Pandas 数据帧,带有索引和提取第三级数据