【发布时间】:2021-10-04 03:30:35
【问题描述】:
func TestGetUID(t *testing.T) {
namespace := "lkfm"
expecteduid := "fake_uid"
var tests = []struct {
description string
expected string
namespace string
objs []runtime.Object
}{
{"PositiveScenario", expecteduid, namespace, []runtime.Object{simpleNamespace(namespace)}},
}
for _, x := range tests {
t.Run(x.description, func(t *testing.T) {
client := fake.NewSimpleClientset(x.objs...)
actual := getUID(client, x.namespace)
assert.Equal(t, x.expected, actual)
})
}
}
Lint 给我一些问题:
- 客户端 := fake.NewSimpleClientset(x.objs...)
- 实际 := getUID(client, x.namespace)
- assert.Equal(t, x.expected, actual)
并报告此错误:“在函数文字(scopelint)中使用范围范围x上的变量”
【问题讨论】:
-
您可以通过在循环内创建
x的副本来使lint开心,即在t.Run(...上方添加x := x。 -
嗨@mkopriva,你能解释一下原因吗?
-
@GiuseppePercuoco 很好,原因与 icza 解释的相同。当您在循环内执行
x := x时,您将声明一个新 变量x并将旧变量x的值分配给它。 linter 检测到这一点并知道循环内任何引用x的代码都引用了当前迭代本地的新x。
标签: unit-testing go